簡體   English   中英

計算 FFT 峰值的強度

[英]Calculating the intensity of a FFT peak

對於物理實驗室,我們的教授給了我們一項任務,即對彈撥的頻譜進行分析。 在聲音采集之后,我們得到了一個執行 FFT 的腳本。

在 FFT 之后,我們現在有幾個頻率峰值。

然后他告訴我們,我們必須分別計算每個峰的強度。 我是這個話題的新手,所以我想請教如何更改給定的代碼以獲得輸出峰值強度,比如從 760 到 765 Hz。

代碼在這里:

from scipy.fftpack import fft,ifft
import matplotlib.pyplot as plt
from scipy.signal import blackman

data =  np.loadtxt("mic.txt")
x = data[:,0]
y = data[:,1]

fy = fft(y)

print np.sum(y),"==",fy[0]

n = len(x)
t = x[-1]
fx = np.linspace(0,n/t,n)

plt.plot(fx[0:n/2],np.abs(fy[0:n/2]))

plt.xlabel("frequency (Hz)")
plt.show()

我會很感激你的幫助,馬修

我認為峰值強度是指每個峰值的大小(當然可以歸一化)。 我使用scipy.signal.find_peaks來獲取頻譜中的峰值。 因為 FFT 返回復數值,所以我在 y 的絕對值上使用它。 這是一個通用示例,因此在大多數情況下找到最大值並不是那么簡單。 還有其他峰值檢測工具,例如scipy.signal.find_peaks_cwtpeakutils包。 scipy 教程這里是一個最小的工作示例:

import numpy as np
from scipy.fft import fft
import matplotlib.pyplot as plt

from scipy.signal import find_peaks

N = 600
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y = np.sin(50.0 * 2.0 * np.pi * x) + 0.5 * np.sin(80.0 * 2.0 * np.pi * x)

yf = fft(y)
xf = np.linspace(0.0, 1.0 / (2.0 * T), N//2)

# finding the peaks in the absolute value of y
y_abs = 2.0 / N * np.abs(yf[0:N//2])
peakind, _ = find_peaks(y_abs)

plt.plot(xf, y_abs)

# plotting the peaks
plt.plot(xf[peakind], y_abs[peakind], 'k.')

plt.grid()
plt.show()

峰的大小只是

>>> y_abs[peakind]
[0.70947072 0.4914645 ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM