无论是仅嵌套它们 (iff(fft(audio))
) 还是尝试窗口处理 (window
音频,进行 fft
,进行 ifft
,然后反转窗口,用 eps 替换零,然后将样本合并回来(在管道中尝试使用 abs
),我只得到噪音。
我知道 ifft
只能对具有无限精度算术、无限多个样本等等的 fft
实现反演 (对吗?) 我使用的是 64 位浮点和 44kHz 采样率。但是,我至少希望能听到原始音频。
我的错误是实际的还是理论的?如果是 bug,我可以提供代码。
在JoeKington的评论基础上,我已经下载了这个文件并尝试了以下几点:
>>> import scipy.io.wavfile
>>> rate, data = scipy.io.wavfile.read('wahoo.wav')
>>> data
array([134, 134, 134, ..., 124, 124, 124], dtype=uint8)
>>> data_bis = np.fft.ifft(np.fft.fft(data))
>>> data_bis
array([ 134. +6.68519934e-14j, 134. -4.57982480e-14j,
134. -1.78967708e-14j, ..., 124. -2.09835513e-14j,
124. -1.61750469e-14j, 124. -2.14867343e-14j])
>>> data_bis = data_bis.astype('uint8')
C:\Users\Jaime y Eva\Desktop\stack_exchange.py:1: ComplexWarning: Casting complex values to real discards the imaginary part
# -*- coding: utf-8 -*-
>>> data_bis
array([134, 133, 133, ..., 123, 123, 123], dtype=uint8)
>>> scipy.io.wavfile.write('wahoo_bis.wav', rate, data_bis)
生成的文件与原始文件完全相同。
因此,将返回的复杂值转换为实数只是问题的一半(您可能希望使用np.abs
而不是上面代码中隐含的data.real
),然后您还需要将浮点数重新转换为适当位深度的uint
。
ifft(fft(audio)).real
或abs(ifft(fft(audio)))
,看看是否会改变任何东西。 - Joe Kingtonscipy.io.wavfile.write()
。我已经尝试了两种方法,问题是获得正确的dtype
(见下文)。 - sam boosalis