我正在从波形文件中做一个rfft和irfft:
samplerate, data = wavfile.read(location)
input = data.T[0] # first track of audio
fftData = np.fft.rfft(input[sample:], length)
output = np.fft.irfft(fftData).astype(data.dtype)
所以它从一个文件中读取,然后进行rfft。但是当我用py音频流播放音频时会产生很多噪音。我试图搜索这个问题的答案并使用了这个解决方案:
rfft or irfft increasing wav file volume in python
这就是我在做irfft时有.astype(data.dtype)的原因。然而,它并没有减少噪音,它减少了一点但仍然听起来都错了。
这是播放,其中p是pyAudio:
stream = p.open(format=pyaudio.paFloat32,
channels=1,
rate=fs,
output=True)
stream.write(output)
stream.stop_stream()
stream.close()
p.terminate()
那我在这里做错了什么?
谢谢!
编辑:我也尝试在执行irfft时使用.astype(dtype = np.float32),因为pyaudio在流式传输音频时会使用它。然而它仍然很吵。
答案 0 :(得分:0)
目前最好的工作解决方案似乎是使用中值进行规范化并使用.astype(np.float32)作为pyAudio输出是float32:
samplerate, data = wavfile.read(location)
input = data.T[0] # first track of audio
fftData = np.fft.rfft(input[sample:], length)
fftData = np.divide(fftData, np.median(fftData))
output = np.fft.irfft(fftData).astype(dtype=np.float32)
如果有人有更好的解决方案,我想听听。我尝试了均值归一化,但它仍然导致剪切音频,使用np.max进行归一化使得整个音频太低。 FFT的这种标准化问题总是给我带来麻烦,并且在SO中没有找到任何100%有效的解决方案。