【问题标题】:How to get original sound after FFT?FFT后如何获得原始声音?
【发布时间】:2021-09-26 15:43:35
【问题描述】:

我正在对我的声音应用 FFT,如下所示:

from scipy.fft import fft

samplerate, data = wavfile.read('./sound.wav')
fft_sound = fft(data)

有没有一种反转方法可以让我从fft_sound 回到data

这就是我所做的:

samplerate, data = wavfile.read('./StarWars3.wav')

print(data)
print(ifft(fft(data)))

但结果看起来完全不同:

[    0     0     0 ... -1502    26   414]
[ 0.00000000e+00-1.17911210e-13j -6.75789623e-13-4.22368515e-14j
  0.00000000e+00+7.03947524e-14j ... -1.50200000e+03-5.15824216e-14j
  2.60000000e+01+3.23030463e-13j  4.14000000e+02+9.36792340e-13j]

我用对了吗?

【问题讨论】:

    标签: python scipy fft


    【解决方案1】:

    有没有一种反转方法可以让我从fft_sound 回到data

    是的,它叫做离散傅里叶逆变换

    就像fft 函数一样,SciPy 也有它的函数;不出所料地命名为ifft

    我用对了吗?

    它返回一个复数值数组,其中j 后缀表示虚部(参见Complex numbers in pythonhttps://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex)。

    正如其文档所述,

    [...] ifft(fft(x)) == x 在数值精度范围内。

    结果以科学计数法显示,所以看起来不同,但在数值上非常接近:

    • -1502变为-1.50200000e+03-5.15824216e-14j(实部为-1.50200000e+03,即-1502;虚部为-5.15824216e-14,非常接近于0)

    • 26变成2.60000000e+01+3.23030463e-13j(实部是2.60000000e+01,也就是26;虚部是3.23030463e-13,非常接近于0)

    等等

    【讨论】:

    • 那么删除虚部是正确的实现方式吗?有参考吗?
    • 是的,相当于四舍五入到最接近的实数。我没有参考资料。
    • 数据可视化挺有意思的,我们在fft之后做abs(complex value),在ifft之后做(complex value).real
    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多