Python與Matlab實現(xiàn)快速傅里葉變化的區(qū)別
注:兩種語言的fft算法是有區(qū)別的,最后細(xì)聊!
Matlab的fftlw函數(shù)
輸入是信號序列、對應(yīng)的時間序列、以及是否作圖,輸出可以得到單邊歸一化之后的頻率與對應(yīng)的振幅,通過輸出可以直接畫出常用的頻譜圖!
function [ F,M ] = fftlw( x,y,draw )
%FFTLW 快速傅里葉變化2021.10.26
%輸入 x--時間 y--信號 draw--1為畫頻譜圖,0為不畫
%輸出 F--頻率 M--幅值
N=length(y); %采樣點數(shù)
if(mod(N,2)>0)
N=N-1;
end
Fs=(N-1)/(x(N)-x(1)); %采樣頻率
F=(N/2:N-1)*Fs/N-Fs/2 ; %頻率
y2=abs(fftshift(fft(y(1:N)))); %快速傅里葉變化
M=2*y2(N/2+1:N)/N; %歸一化
M(1)=M(1)/2; %常量除以2
if draw==1 %可視化
figure
plot(F,M)
xlabel('f/HZ')
ylabel('amplitude')
title('頻譜圖')
end
end
Python的fftlw函數(shù)
輸入與matlab的略有點不同,分別是采樣頻率、信號序列、是否作圖,輸出與matlab的函數(shù)一致。
import numpy as np
from scipy.fftpack import fft,ifft
import matplotlib.pyplot as plt
def fftlw(Fs,y,draw):
'''
Parameters
----------
Fs : 采樣頻率
y : 信號序列
draw :1為畫頻譜圖,0為不畫
Returns
-------
f : 頻率
M : 幅值
'''
L=len(y) #采樣點數(shù)
f = np.arange(int(L / 2)) * Fs / L #頻率
#M = np.abs(np.fft.fft(y))*2/L #采用numpy.fft.fft()函數(shù)并歸一化
M = np.abs((fft(y))) *2/L #采用scipy.fftpack.fft()函數(shù)并歸一化
M = M[0:int(L / 2)] #取單邊譜
M[0]=M[0]/2 #常量除以2
if draw==1: #可視化
plt.figure()
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot(f,M)
plt.xlabel('f/HZ')
plt.ylabel('amplitude')
plt.title('頻譜圖')
return f,M
構(gòu)造簡單的信號對比兩種語言fftlw效果
舉個例子,構(gòu)造如下信號驗證所寫函數(shù)的正確性:
y=3+t⋅sin(2πt⋅100)+3⋅sin(2πt⋅200)
其中,包括常數(shù)項,周期項和趨勢項,理論上該信號的頻率應(yīng)該為0Hz、100Hz、200Hz(具體怎么算的補(bǔ)一補(bǔ)書知識)。在這里,我設(shè)置采樣頻率 fs=10000,產(chǎn)生10000個數(shù)據(jù)點,時域圖如下:

Matlab調(diào)用fftlw函數(shù)的主函數(shù)
fs=10000; %采樣頻率
x=0:1/fs:(10000-1)/fs; %時間序列
y=sin(2*pi*x*100).*x+3*sin(2*pi*x*200)+3; %信號序列
figure %畫時域圖
plot(x,y)
title('時域圖')
xlabel('t/s')
ylabel('amplitude')
[f,m]=fftlw(x,y,1); %快速傅里葉變化并畫頻譜圖
得到的頻譜圖如下:發(fā)現(xiàn)0Hz、100Hz、200Hz處的幅值分別為3,0.5,3。0Hz與200Hz處的幅值完美對應(yīng)時域中常數(shù)項與s i n ( 2 π t ⋅ 200 ) 的系數(shù);而100Hz項sin(2πt⋅200)的系數(shù)不是常數(shù)而是 t,且時間是0-1s,該項傅里葉變化得到的是該段時間內(nèi)的平均幅值,也就是0.5。

Python調(diào)用fftlw函數(shù)的主函數(shù)
直接加在def fftlw()的后文調(diào)用他就行。
Fs=10000 #采用頻率 L=10000 #采樣點數(shù) t=np.arange(0,L/Fs,1/Fs) #時間序列 y=np.sin(2*np.pi*t*100)*t+3*np.sin(2*np.pi*t*200)+3 #信號序列 f,M=fftlw(Fs,y,1) #快速傅里葉變化并畫頻譜圖

圖和matlab的一模一樣!但是!
采用實際的振動信號對比兩種語言fftlw效果
數(shù)據(jù)來源于西儲大學(xué)轉(zhuǎn)子實驗臺振動信號,采樣頻率為12000Hz,現(xiàn)取正常狀態(tài)下、轉(zhuǎn)速1796 rpm軸承振動信號1000個點如下。粗略的觀察,有一個低頻信號大概周期為0.035 s,頻率大概 29Hz。

Matlab畫頻譜圖

Python畫頻譜圖

python的頻譜圖的幅值與原始數(shù)據(jù)量級差別較大,與matlab的頻譜圖也毫不相關(guān),可能是底層傅里葉變換的算法不同所致,具體哪個正確還帶進(jìn)一步考證?。?!
到此這篇關(guān)于Python與Matlab實現(xiàn)快速傅里葉變化的區(qū)別的文章就介紹到這了,更多相關(guān)Python 傅里葉變化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你掌握Python內(nèi)置reversed函數(shù)的使用
Python作為一門強(qiáng)大的編程語言,提供了許多內(nèi)置函數(shù)來處理各種數(shù)據(jù)結(jié)構(gòu)和對象,本文將詳細(xì)探討reversed函數(shù)的用法、示例代碼以及實際應(yīng)用場景,需要的可以參考下2024-01-01
Python編程實現(xiàn)的簡單Web服務(wù)器示例
這篇文章主要介紹了Python編程實現(xiàn)的簡單Web服務(wù)器功能,涉及Python URL請求與響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
Pycharm遠(yuǎn)程調(diào)試openstack的方法
這篇文章主要為大家詳細(xì)介紹了Pycharm遠(yuǎn)程調(diào)試openstack的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
python使用PythonMagick將jpg圖片轉(zhuǎn)換成ico圖片的方法
這篇文章主要介紹了python使用PythonMagick將jpg圖片轉(zhuǎn)換成ico圖片的方法,涉及PythonMagick模塊操作圖片的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03
用Python的Tornado框架結(jié)合memcached頁面改善博客性能
這篇文章主要介紹了用Python的Tornado框架結(jié)合memcached頁面改善vLog性能,主要使用到了緩存來提升性能,需要的朋友可以參考下2015-04-04
Python OpenCV 彩色與灰度圖像的轉(zhuǎn)換實現(xiàn)
為了加快處理速度在圖像處理算法中,往往需要把彩色圖像轉(zhuǎn)換為灰度圖像,本文主要介紹了Python OpenCV 彩色與灰度圖像的轉(zhuǎn)換實現(xiàn),感興趣的可以了解一下2021-06-06
Python實現(xiàn)爬蟲抓取與讀寫、追加到excel文件操作示例
這篇文章主要介紹了Python實現(xiàn)爬蟲抓取與讀寫、追加到excel文件操作,結(jié)合具體實例形式分析了Python針對糗事百科的抓取與Excel文件讀寫相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
python實現(xiàn)的登錄與提交表單數(shù)據(jù)功能示例
這篇文章主要介紹了python實現(xiàn)的登錄與提交表單數(shù)據(jù)功能,結(jié)合實例形式分析了Python表單登錄相關(guān)的請求與響應(yīng)操作實現(xiàn)技巧,需要的朋友可以參考下2019-09-09

