我是一个蟒蛇初学者,作为一个学习项目,我正在使用Wraase SC2-120方法做一个SSTV编码器。
对于那些不知道的人来说,SSTV是一种将图像作为声音通过无线电发送,并在接收端解码回图像的技术。Wraase SC2-120是多种编码方式之一,但它是支持颜色的更简单的编码方式之一。
我已经能够创建一个接收图像并将其转换为数组的系统。然后,获取该数组并为编码器所需的亮度和色度创建所需的值。
然后,我使用这个块为该方法创建一个1500 the 2300hz之间的值。
def ChrominanceAsHertz(value=0.0):
value = 800 * value
value -= value % 128 # Test. Results were promising but too much noise
value += 1500
return int(value)
你可以忽略模数运算。这只是我玩数据“有趣”和实验的方式。
然后,我清理音频,以避免在同一个数组中有太多相同的值,并将它们的持续时间相加,以获得更清晰的声音。
cleanTone = []
cleanDuration = []
for i in range(len(hertzData)-1):
# If the next tone is not the same
# Add it to the cleantone array
# with it's initial duration
if hertzData[i] != hertzData[i+1]:
cleanTone.append(hertzData[i])
cleanDuration.append(durationData[i])
# else add the duration of the current hertz to the clean duration array
else:
# the current duration is the last inserted duration
currentDur = cleanDuration[len(cleanDuration)-1]
# Add the new duration to the current duration
currentDur += durationData[i]
cleanDuration[len(cleanDuration)-1] = currentDur
我的数组处理可以使用一些工作,但这不是我现在在这里的原因。
结果是一个数组,其中没有连续的值是相同的,并且该音调的持续时间仍然是正确的。
然后使用这个块创建一个sinewave数组。
audio = []
for i in range(len(cleanTone)):
sineAudio = AudioGen.SineWave(cleanTone[i], cleanDuration[i])
for sine in sineAudio:
audio.append(sine)
正弦波函数是
def SineWave( freq=440, durationMS = 500, sample_rate = 44100.0 ):
num_samples = durationMS * (sample_rate / 1000)
audio = []
for i in range(int(num_samples)):
audio.insert(i, np.sin(2 * np.pi * freq * (i / sample_rate)))
return audio
它的工作原理是预期的。它为我想要的频率和我想要的持续时间创造了一个正弦波。
问题是,当我创建.wav文件时,使用wave创建的正弦波并不能顺利转换。
我的意思是特写的截图。正弦波伪影
音频文件有这些巨大的尖叫和裂缝,因为这些工件,上面的方法产生,看它如何采取一个单一的频率和持续时间,而不考虑最后的音调结束,并开始一个新的。
我试图纠正这些问题的方法是重构这个SineWave方法,将整个数组作为一个数组,然后直接创建一个又一个的正弦波,希望得到一个干净的声音,但它仍然做了同样的事情。
我还尝试了“平滑”生成的音频数组,然后使用了来自这个职位的简单过滤操作。
0.7 * audio[1:-1] + 0.15 * ( audio[2:] + audio[:-2] )
但结果再次令人不满意,器物仍然存在。
我也开始研究傅立叶变换,主要是FFT (快速傅立叶变换),但我对它们还不太熟悉,我还不知道我到底想做什么和编写代码。
为了使SSTV工作,频率的变化有时必须非常快。准确地说,0.3ms速度很快,所以我有点不知道如何做到这一点,而不会在这个过程中丢失太多的数据。
我的正弦波功能是在音调变化之间产生伪影,引起划痕和不需要的pops。怎么才能不这么做?
发布于 2022-04-18 08:23:08
你需要从一个波段转移到下一个波段。你必须从你结束前一阶段的阶段开始下一波。
def SineWave( freq=440, durationMS = 500, phase = 0, sample_rate = 44100.0):
num_samples = int(durationMS * (sample_rate / 1000))
audio = []
for i in range(num_samples):
audio.insert(i, np.sin(2 * np.pi * freq * (i / sample_rate) + phase))
phase = (phase + 2 * np.pi * freq * (num_samples / sample_rate)) % (2 * np.pi)
return audio, phase
在您的主循环中,从一个波段到另一个波段通过这个阶段:
audio = []
phase = 0
for i in range(len(cleanTone)):
sineAudio, phase = AudioGen.SineWave(cleanTone[i], cleanDuration[i], phase)
for sine in sineAudio:
audio.append(sine)
https://stackoverflow.com/questions/71909443
复制相似问题