Dul*_*cia 3 python numpy fft matplotlib scipy
我在管理FFT数据方面遇到了一些问题.我正在寻找很多关于如何进行FFT的例子,但我无法从他们中任何一个得到我想要的东西.我有一个44kHz采样率的随机波形文件,我希望每X ms得到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()
Run Code Online (Sandbox Code Playgroud)
这是我使用的最后一个例子,我发现它在stackoverflow上的某个地方.问题是,这需要我想要的幅度,获得频率,但根本没有时间.据我所知,FFT分析是3D,这是所有谐波的"合并"结果.我明白了:
根据我对代码的理解,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]
Run Code Online (Sandbox Code Playgroud)
不需要可视化,结果应该只是上面列出的数组(或散列/字典).
进一步@保罗的r的答案,scipy.signal.spectrogram是一个频谱函数在SciPy的的信号处理模块.
上述链接的示例如下:
from scipy import signal
import matplotlib.pyplot as plt
# Generate a test signal, a 2 Vrms sine wave whose frequency linearly
# changes with time from 1kHz to 2kHz, corrupted by 0.001 V**2/Hz of
# white noise sampled at 10 kHz.
fs = 10e3
N = 1e5
amp = 2 * np.sqrt(2)
noise_power = 0.001 * fs / 2
time = np.arange(N) / fs
freq = np.linspace(1e3, 2e3, N)
x = amp * np.sin(2*np.pi*freq*time)
x += np.random.normal(scale=np.sqrt(noise_power), size=time.shape)
#Compute and plot the spectrogram.
f, t, Sxx = signal.spectrogram(x, fs)
plt.pcolormesh(t, f, Sxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7485 次 |
| 最近记录: |