ifft(fft(audio))只是噪音。

5

无论是仅嵌套它们 (iff(fft(audio))) 还是尝试窗口处理 (window 音频,进行 fft,进行 ifft,然后反转窗口,用 eps 替换零,然后将样本合并回来(在管道中尝试使用 abs),我只得到噪音。

我知道 ifft 只能对具有无限精度算术、无限多个样本等等的 fft 实现反演 (对吗?) 我使用的是 64 位浮点和 44kHz 采样率。但是,我至少希望能听到原始音频。

我的错误是实际的还是理论的?如果是 bug,我可以提供代码。


1
理论上你是正确的。你能展示一下你的代码吗? - Kamyar Souri
6
你的问题可能与将数据重新编码回音频有关。ifft返回复数浮点数。根据你使用的库,它可能会将数组的内存缓冲区转储到磁盘上作为.wav文件,而不需要将事物重新转换为浮点数。无论如何,这是产生完全垃圾输出的一种方法......尝试编写ifft(fft(audio)).realabs(ifft(fft(audio))),看看是否会改变任何东西。 - Joe Kington
我使用了 scipy.io.wavfile.write()。我已经尝试了两种方法,问题是获得正确的 dtype(见下文)。 - sam boosalis
1个回答

6

在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


我的问题是错误的类型转换。我将'int8'更改为'uint16'。由于我正在添加音符(以“.wav”读取)来制作和弦,所以我认为在写输出时应该使用相同的数据类型。但事实并非如此。ifft和fft是反向操作,宇宙又恢复了意义! - sam boosalis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接