Numpy RFFT / IRFFT卷

时间:2018-03-13 12:41:17

标签: python audio fft pyaudio

我正在从波形文件中做一个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在流式传输音频时会使用它。然而它仍然很吵。

1 个答案:

答案 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%有效的解决方案。