簡體   English   中英

我如何使用 scipy plot 和 python 中的 fft 並修改頻率范圍,使其在中心顯示兩個峰值頻率?

[英]How do I plot an fft in python using scipy and modify the frequency range so that it shows the two peaks frequencies in the center?

以下 Python 代碼使用 numpy 生成正弦曲線圖的頻率 plot:

import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

# Number of samplepoints
N = 600
# sample spacing
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 = scipy.fftpack.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N//2)

fig, ax = plt.subplots()
ax.plot(xf, 2.0/N * np.abs(yf[:N//2]))
plt.show()

在此處輸入圖像描述

基於上面的代碼,我們繪制了一個具有兩個頻率的正弦波,一個頻率為 50Hz,另一個頻率為 80Hz。 您可以清楚地看到傅立葉變換 plot 顯示了這兩個頻率的峰值。

我的問題:如何修改上面的代碼,使 x 軸的范圍為 0-100Hz?

如果我改變

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

xf = np.linspace(0.0, 100, N//2)

然后我的圖表看起來像:

在此處輸入圖像描述

但是圖表現在顯示我的峰值在 11 和 20Hz 左右,這是不正確的。 當我改變軸時,峰值不應改變。

我究竟做錯了什么?

import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

# Number of samplepoints
N = 600
# sample spacing
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 = scipy.fftpack.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N//2)

fig, ax = plt.subplots()
ax.plot(xf, 2.0/N * np.abs(yf[:N//2]))
ax.set(
    xlim=(0, 100)
)
plt.show()

只需添加xlim

在此處輸入圖像描述

另一種解決方案是 plot 的適當范圍值。

執行 FFT 時,結果的頻率步長以及達到某個頻率的 bin 數量取決於提交給 FFT 算法的樣本數量和采樣率。 因此,選擇到plot的范圍時,可以執行一個簡單的計算,例如,帶有中心F的bin索引為:

idx = ceil(f * t.size / sr)

此代碼有效:

from numpy import arange, sin, pi, abs
from math import ceil
import matplotlib.pyplot as plt
from scipy.fft import rfft, rfftfreq

sr = 800 # Sampling rate = 800Hz
N = 600 # Number of samplepoints (duration = 0.75s)
t = arange(0, N/sr, 1/sr) # Sampling times

# Sampled values
s = sin(50 * 2*pi*t) + 0.5*sin(80 * 2*pi*t)

# FFT and bin centers
y = rfft(s)
f = rfftfreq(t.size, 1/sr)

# Index of 100Hz bin
f_hi = 100
idx_hi = ceil(f_hi * t.size / sr)

# Plot spectrum
fig, ax = plt.subplots()
ax.plot(f[:idx_hi], abs(y[:idx_hi]))
plt.show()

並產生:

在此處輸入圖像描述


由於您只處理真實信號,因此可以使用rfft而不是處理復數的fft來縮短計算時間。 要獲得頻點中心,您可以使用rfftfreq

暫無
暫無

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

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