gpt4 book ai didi

python - 如何在 Python 中从 FFT 获取时间/频率

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:17 25 4
gpt4 key购买 nike

我在管理 FFT 数据时遇到了一点问题。我一直在寻找许多如何进行 FFT 的示例,但我无法从其中任何一个中得到我想要的东西。我有一个 44kHz 采样率的随机波形文件,我想每 X 毫秒获得 N 次谐波的幅度,假设 100 毫秒就足够了。我试过这段代码:

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 个频率的所有幅度,包括出现特定幅度时的时间。

结果应该类似于这个数组:[time,frequency,amplitude]所以最后如果我们想要 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.spectrogramspectrogram functionscipy's signal processing module .

上面链接的例子如下:

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()

enter image description here

关于python - 如何在 Python 中从 FFT 获取时间/频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com