基於python的快速傅利葉變換FFT(二)

2022-04-25 13:03:43 字數 1926 閱讀 9928

知識點fft變換,其實就是快速離散傅利葉變換,傅利葉變換是數字訊號處理領域一種很重要的演算法。要知道傅利葉變換演算法的意義,首先要了解傅利葉原理的意義。傅利葉原理表明:任何連續測量的時序或訊號,都可以表示為不同頻率的正弦波訊號的無限疊加。而根據該原理創立的傅利葉變換演算法利用直接測量到的原始訊號,以累加方式來計算該訊號中不同正弦波訊號的頻率、振幅和相位。

和傅利葉變換演算法對應的是反傅利葉變換演算法。該反變換從本質上說也是一種累加處理,這樣就可以將單獨改變的正弦波訊號轉換成乙個訊號。因此,可以說,傅利葉變換將原來難以處理的時域訊號轉換成了易於分析的頻域訊號(訊號的頻譜),可以利用一些工具對這些頻域訊號進行處理、加工。最後還可以利用傅利葉反變換將這些頻域訊號轉換成時域訊號。

假設fft之後某點n用複數a+bi表示,那麼這個複數的模就是an=sqrt(a*a+b*b)(某點處的幅度值an = a*(n/2))

y = sin(2*pi*fs*t);fs=150hz,fs=25hz。具體**如下:

import

matplotlib.pyplot as plt

import

numpy as np

import

seaborn

fs = 150.0; #

sampling rate取樣率

ts = 1.0/fs; #

sampling interval 取樣區間

t = np.arange(0,1,ts) #

time vector,這裡ts也是步長

ff = 25; #

frequency of the signal訊號頻率

y = np.sin(2*np.pi*ff*t)

n = len(y) #

length of the signal

k =np.arange(n)

t = n/fs

frq = k/t #

two sides frequency range

frq1 = frq[range(int(n/2))] #

one side frequency range

yy = np.fft.fft(y) #

未歸一化

y = np.fft.fft(y)/n #

fft computing and normalization 歸一化

y1 = y[range(int(n/2))]

fig, ax = plt.subplots(4, 1)

ax[0].plot(t,y)

ax[0].set_xlabel(

'time')

ax[0].set_ylabel(

'amplitude')

ax[1].plot(frq,abs(yy),'

r') #

plotting the spectrum

ax[1].set_xlabel('

freq (hz)')

ax[1].set_ylabel('

|y(freq)|')

ax[2].plot(frq,abs(y),'

g') #

plotting the spectrum

ax[2].set_xlabel('

freq (hz)')

ax[2].set_ylabel('

|y(freq)|')

ax[3].plot(frq1,abs(y1),'

b') #

plotting the spectrum

ax[3].set_xlabel('

freq (hz)')

ax[3].set_ylabel('

|y(freq)|')

plt.show()

結果

結果驗證

快速傅利葉

參考 ae 97 e6 b3 95 e5 ad a6 e4 b9 a0 e7 ac 94 e8 ae b0 hdu大整數乘法 include include include include include using namespace std const double pi acos 1.0 複數...

快速傅利葉(FFT)

快速傅利葉 更加形象的理解傅利葉變換 大概了解之後 從傅利葉級數到傅利葉變換 太大,只能裁剪為兩張 刨根問底的同學 雷德演算法 輸出序列是按自然順序排列的,而輸入序列的順序則是 位元反轉 方式排列的。也就是說,將序號用二進位制表示,然後將二進位制數以相反方向排列,再以這個數作為序號。如011變成11...

FFT快速傅利葉

description 給出兩個n位10進製整數x和y,你需要計算xy。input 第一行乙個正整數n。第二行描述乙個位數為n的正整數x。第三行描述乙個位數為n的正整數y output 輸出一行,即xy的結果。資料範圍 n 60000 乙個整數x a nan 1.a 0x a na a 0 x an...