【问题标题】:ifft(fft(audio)) is just noiseifft(fft(audio)) 只是噪音
【发布时间】:2013-01-29 01:27:42
【问题描述】:

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

我知道 ifft 仅与 fft 反向,具有无限精度算术、无限多样本等(对吗?)我正在使用 64 位浮点和 44kHZ 采样率。但是,我希望至少能够听到原始音频。

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

【问题讨论】:

  • 理论上你是对的。你能展示你的代码吗?
  • 这是您如何将数据编码回音频的案例吗? ifft 将返回复杂的浮点数。根据您使用的库,它可能只是将数组的内存缓冲区作为 .wav 转储到磁盘,而无需将内容重新转换回浮点数。无论如何,这是产生完整垃圾作为输出的一种方法......尝试写ifft(fft(audio)).realabs(ifft(fft(audio))),看看它是否会改变任何东西
  • 我使用了scipy.io.wavfile.write()。我已经尝试了这两种方法,问题是正确的dtype(见下文)。

标签: numpy fft ifft


【解决方案1】:

根据 JoeKington 的评论,我已经下载了this file,并尝试了以下操作

>>> 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,就像上面的代码隐含的那样),然后您还需要重铸浮动将数字指向适当位深度的uints。

【讨论】:

  • 我的问题是演员阵容错误。我将“int8”更改为“uint16”。因为我正在添加音符(读作.wav)来制作和弦,所以我认为在编写输出时我应该使用相同的 dtype。不。 ifft 和 fft 是相反的,宇宙又有意义了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多