您现在的位置是:群英 > 开发技术 > Python语言
Python中实现傅里叶变化与Matlab有啥不同
Admin发表于 2022-08-19 17:50:28803 次浏览
这篇文章主要介绍了title,小编觉得挺不错的,现在分享给大家,也给大家做个参考,希望大家通过这篇文章可以有所收获。

 


注:两种语言的fft算法是有区别的,最后细聊!

Matlab的fftlw函数

输入是信号序列、对应的时间序列、以及是否作图,输出可以得到单边归一化之后的频率与对应的振幅,通过输出可以直接画出常用的频谱图!

function [ F,M ] = fftlw( x,y,draw )
%FFTLW 快速傅里叶变化2021.10.26
%输入   x--时间 y--信号 draw--1为画频谱图,0为不画
%输出   F--频率 M--幅值


N=length(y);                       %采样点数
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函数

输入与matlab的略有点不同,分别是采样频率、信号序列、是否作图,输出与matlab的函数一致。

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)                              #采样点数
    f = np.arange(int(L / 2)) * Fs / L    #频率
    #M = np.abs(np.fft.fft(y))*2/L         #采用numpy.fft.fft()函数并归一化
    M = np.abs((fft(y))) *2/L             #采用scipy.fftpack.fft()函数并归一化
    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

构造简单的信号对比两种语言fftlw效果

举个例子,构造如下信号验证所写函数的正确性:

y=3+t⋅sin(2πt⋅100)+3⋅sin(2πt⋅200)

其中,包括常数项,周期项和趋势项,理论上该信号的频率应该为0Hz、100Hz、200Hz(具体怎么算的补一补书知识)。在这里,我设置采样频率 fs=10000,产生10000个数据点,时域图如下:

Matlab调用fftlw函数的主函数

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);                           %快速傅里叶变化并画频谱图

得到的频谱图如下:发现0Hz、100Hz、200Hz处的幅值分别为3,0.5,3。0Hz与200Hz处的幅值完美对应时域中常数项与s i n ( 2 π t ⋅ 200 ) 的系数;而100Hz项sin(2πt⋅200)的系数不是常数而是 t,且时间是0-1s,该项傅里叶变化得到的是该段时间内的平均幅值,也就是0.5。

Python调用fftlw函数的主函数
直接加在def fftlw()的后文调用他就行。

Fs=10000                #采用频率
L=10000                 #采样点数
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效果

数据来源于西储大学转子实验台振动信号,采样频率为12000Hz,现取正常状态下、转速1796 rpm轴承振动信号1000个点如下。粗略的观察,有一个低频信号大概周期为0.035 s,频率大概 29Hz。

Matlab画频谱图

Python画频谱图

python的频谱图的幅值与原始数据量级差别较大,与matlab的频谱图也毫不相关,可能是底层傅里叶变换的算法不同所致,具体哪个正确还带进一步考证!!!


到此这篇关于“Python中实现傅里叶变化与Matlab有啥不同”的文章就介绍到这了,感谢各位的阅读,更多相关Python中实现傅里叶变化与Matlab有啥不同内容,欢迎关注群英网络资讯频道,小编将为大家输出更多高质量的实用文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-09-29 17:50:00 
摘要:这篇文章主要为大家介绍了go语言用八百行代码实现一个JSON解析器实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-04-28 14:34:55 
摘要:给大家带来一篇关于jquery获取点击控件的绝对位置的具体做法的相关教程文章,内容涉及到jquery、获取点击、jquery获取点击控件的绝对位置等相关内容,更多关于jquery获取点击控件的绝对位置的内容希望能够帮助到大家。
2022-12-01 16:14:52 
摘要:表单传送数据到php乱码的解决办法:1、在html中的head处添加“<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">”;2、确保所有文件都是utf8编码;3、在php中添加“header("Content-Type:text/html; charset=UTF-8");”。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部