我在管理FFT数据时遇到了一个小问题。我在寻找许多如何进行FFT的例子,但是我无法从任何一个例子中得到我想要的。我有一个44kHz采样率的随机波文件,我想得到每X毫秒的N次谐波的大小,假设100ms就足够了。我试过这个密码:
import scipy.io.wavfile as wavfile
import numpy as np
import pylab as pl
rate, data = wavfile.read("sound.wav")
t = np.arange(len(data[:,0]))*1.0/rate
p = 20*np.log10(np.abs(np.fft.rfft(data[:2048, 0])))
f = np.linspace(0, rate/2.0, len(p))
pl.plot(f, p)
pl.xlabel("Frequency(Hz)")
pl.ylabel("Power(dB)")
pl.show()
这是我使用的最后一个例子,我在stackoverflow的某个地方找到的。问题是,这得到了我想要的大小,得到了频率,但根本没有时间。据我所知,FFT分析是3D的,这是所有谐波的“合并”结果。我明白了:
X-axis = Frequency, Y-axis = Magnitude, Z-axis = Time (invisible)
从我对代码的理解来看,t是时间——看起来是这样,但在代码中并不需要——我们可能需要它。p是功率(或幅度)的数组,但似乎是每个频率f的所有幅度的一些平均值,即频率数组。我不需要平均值/合并值,我需要每X毫秒N次谐波的幅度。
长话短说,我们可以得到:所有频率的1个量级。
我们想要:N个频率的所有震级,包括出现某个震级的时间。
结果应该类似于这个数组:[时间、频率、振幅] 最后如果我们想要3次谐波,它看起来像:
[0,100,2.85489] #100Hz harmonic has 2.85489 amplitude on 0ms
[0,200,1.15695] #200Hz ...
[0,300,3.12215]
[100,100,1.22248] #100Hz harmonic has 1.22248 amplitude on 100ms
[100,200,1.58758]
[100,300,2.57578]
[200,100,5.16574]
[200,200,3.15267]
[200,300,0.89987]
不需要可视化,结果应该只是上面列出的数组(或散列/字典)。
除了@Paul R的答案之外,
scipy.signal.spectrogram
是scipy's signal processing module中的spectrogram function。上述链接的示例如下:
编辑:哦,看来这会返回值,但它们根本不适合音频文件。即使它们可以用作谱图上的幅度,但它们在那些经典的音频可视化工具中是不起作用的,例如在许多音乐播放器中都可以看到。我也试过用matplotlib的pylab做谱图,但结果是一样的。
有什么可以在可视化中获得数据库的技巧吗? 基本上,我们显然已经从上面的代码中得到了所需的一切,只是如何使它返回正常值?忽略
mi
和mx
,因为这些只是调整数组中的值以适应mi..mx间隔-这将用于可视化。如果我是正确的,spectrum
在这段代码中返回数组数组,数组中包含来自freqs
数组的每个频率的振幅,这些振幅根据t
数组准时出现,但是值是如何工作的-如果返回这些奇怪的值,它是否真的是振幅,如果是,如何将其转换为dBs例如。我需要像音乐播放器那样的可视化工具的输出,但是它不应该实时工作,我只需要数据,但是值不适合wav文件。
编辑2:我注意到还有一个问题。对于90秒wav,
t
数组包含175.x之前的时间,考虑到frame_rate
对于wav文件是正确的,这看起来非常奇怪。所以现在我们有两个问题:spectrum
似乎没有返回正确的值(如果我们得到正确的时间,它可能会适合),而t
似乎返回了wav的两倍时间。已修复:案例完全解决。
Specgram需要稍加调整,我只加载了一个scipy.io库(而不是wave库)通道。同样,如果没有将mode设置为magnitude,它将返回10log10而不是20log10,这就是它没有返回正确值的原因。
看起来您正在尝试实现一个spectrogram,这是一个功率谱估计序列,通常由一系列(通常是重叠的)fft实现。因为你只有一个FFT(频谱),所以你还没有时间维度。将FFT代码放在一个循环中,每次迭代处理一个样本块(例如1024个),连续块之间有50%的重叠。生成的光谱序列将是时间v频率v幅度的3D阵列。
我不是一个Python人,但是我可以给你一些伪代码,这些代码应该足以让你编码:
相关问题 更多 >
编程相关推荐