0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Matlab利用离散傅里叶变换DFT进行频谱分析的步骤

冬至子 来源:Matlab Fans 作者:Matlab Fans 2023-07-20 17:33 次阅读

信号在频域能够呈现出时域不易发现的性质和规律,傅里叶变换是将信号从时域变换到频域,便于在频域对信号的特性进行分析。离散傅里叶变换 (DFT),是傅里叶变换在时域和频域上的离散呈现形式,通俗的说就是将经过采样的有限长度时域离散采样序列变换为等长度的频域离散采样序列,通过对变换得到的频域采样序列进行适当的换算和处理,可以得到信号的频谱(频率-幅值曲线和频率-相位曲线)。

1. 定义

离散傅里叶变换 (DFT)的定义为:

图片

式中,x(n)为时域离散采样序列(通常为实数序列),N为时域离散采样序列x(n)的长度,X(k)为频域离散采样序列(通常为复数序列)。

快速傅里叶变换(FFT)是离散傅里叶变换(DFT)的一种快速算法,FFT的计算结果与DFT完全相同,但FFT相对于DFT减小了计算量、节约计算资源消耗,能够适应在线计算,因此实际DFT都是通过FFT算法来求得结果。

Matlab软件自带fft函数实现快速傅里变换算法,但是光使用fft并不能直接得到信号的频谱,还需要解决以下问题:

图片

  • 幅值变换 :X(k)序列的幅值大小与参与变换的时域序列x(n)长度N有关,变换后的幅值|X(k)|需要乘以2/N得到真实幅值;
  • 有效频率区域 :X(k)序列由两部分共轭复数序列组成(复数共轭表示幅值相等、相位相反),相当于只有一半的复数序列是独立有效的,这部分复数序列对应0~fs/2的频率区域(fs为时域离散采样序列x(n)的采样频率)。
  • ** 直流信号的处理** :直流信号幅值(对应频率0Hz)为两部分共轭复数序列在频率0Hz处的加和,其真实幅值再乘以2/N后还需要再除以2得到真实的直流信号幅值。

2. 函数

初学的朋友若不理解上述变换和处理技巧,很难得到正确的频谱图。为此作者在fft函数的基础上,使用Matlab开发了函数 DFT.m ,通过函数来实现上述幅值变换、有效频率区域和直流信号的处理,能够直接分析出给定离散信号x(n)的幅值谱和相位谱,函数简单、易用、通用性好。

function [f,X_m,X_phi] = DFT(xn,ts,N,drawflag)
% [f,X_m,X_phi] = DFT(xn,ts,N,drawflag) 离散序列的快速傅里叶变换,时域转换为频域
% 输入  xn为离散序列 为向量  
%       ts为序列的采样时间/s
%       N为FFT变换的点数,默认为xn的长度  
%       drawflag为绘图标识位,取0时不绘图,其余非0值时绘图,默认为绘图
% 输出 f为频率向量
%      X_m为幅值向量
%      X_phi为相位向量,单位为°
% 注意计算出来的0频分量(直流分量应该除以2)  直流分量的符号应结合相位图来确定

3. 演示

3.1 单频正弦信号(整数周期采样)

%% Eg 1 单频正弦信号
ts = 0.01;
t = 0:ts:1;
A = 1.5;       % 幅值  
f = 2;         % 频率
w = 2*pi*f;    % 角频率
phi = pi/3;    % 初始相位 
x = A*cos(w*t+phi);   % 时域信号
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

图片

图片

结果

正弦信号频率为2Hz,频谱分析频率为1.98Hz
正弦信号幅值为1.5,频谱分析幅值为1.495
正弦信号相位为60°,频谱分析相位为63.32°

**3.2 **单频正弦信号(非整数周期采样)

%% Eg 2 单频正弦信号(非整数周期采样)
ts = 0.01;
t = 0:ts:1;
A = 1.5;       % 幅值  
f = 1.5;         % 频率
w = 2*pi*f;    % 角频率
phi = pi/3;    % 初始相位 
x = A*cos(w*t+phi);   % 时域信号
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

图片

图片

结果

正弦信号频率为1.5Hz,频谱分析频率为0.99Hz、1.98Hz
正弦信号幅值为1.5,频谱分析幅值为1.034、0.923
正弦信号相位为60°,频谱分析相位为160.93°、-33.76°

总结:

DFT变换后频率序列的最小单位刻度为f s /N(此例为1Hz),非整数周期采样时关心信号的频率(此例为1.5Hz)不是频率分辨率f s /N的正整数倍,那这个频率成分信号会由前后两个正整数倍的频率成分信号(此例为1Hz和2Hz)的线性组合来替代,这就是频谱泄漏现象,非周期采样时某频率成分信号向两侧频率分辨率正整数倍的频点泄漏。实际频谱分析时并不清楚所关心的频率点精确值,避免此问题的一个解决方法是,取更多的点参加DFT,即时域序列x(n)长度N值取长一些,让频率分辨率f s /N很小,以减小频谱泄漏现象。再看下例。

%% Eg 2 单频正弦信号(非整数周期采样)
ts = 0.01;
t = 0:ts:1;
A = 1.5;       % 幅值  
f = 1.5;         % 频率
w = 2*pi*f;    % 角频率
phi = pi/3;    % 初始相位 
x = A*cos(w*t+phi);   % 时域信号
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

图片

图片

结果: 频谱泄漏情况大为改善,采样点继续增多时,频谱泄漏会进一步减小。

正弦信号频率为1.5Hz,频谱分析频率主要成分为1.46Hz、
正弦信号幅值为1.5,频谱分析频率主要成分对应幅值为1.41
正弦信号相位为60°,频谱分析频率主要成分对应相位为89.5°

3.3 含有直流分量的单频正弦信号

%% Eg 3 含有直流分量的单频正弦信号
ts = 0.01;
t = 0:ts:1;
A = 1.5;       % 幅值  
f = 5;         % 频率
w = 2*pi*f;    % 角频率
phi = pi/6;    % 初始相位 
x = 0.5 + A*cos(w*t+phi);   % 时域信号,带有直流偏移0.5
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

图片

图片

结果

正弦信号频率为5Hz,频谱分析频率为4.95Hz
正弦信号幅值为1.5,频谱分析幅值为1.498
正弦信号相位为30°,频谱分析相位为38.66°
正弦信号直流分量0.5,频谱分析直流分量为0.51

**3.4 **正弦复合信号

%% Eg 4 正弦复合信号
ts = 0.01;
t = 0:ts:2;
A = [1.5 1 0.5 0.2];    % 幅值  
f = [3 6 9 15];         % 频率
w = 2*pi*f;             % 角频率
phi = (1:4)*pi/4;       % 初始相位 
x = -0.5 + A(1)*cos(w(1)*t+phi(1)) + A(2)*cos(w(2)*t+phi(2)) + A(3)*cos(w(3)*t+phi(3)) + A(4)*cos(w(4)*t+phi(4));     % 时域信号
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

图片

图片

结果

正弦信号频率为3、6、9、15Hz,频谱分析频率为2.985、5.97、8.96、14.93Hz
正弦信号幅值为1.5、1、0.5、0.2,频谱分析幅值为1.499、0.989、0.485、0.192
正弦信号相位为45°、90°、135°、180°,频谱分析相位为50.6°、101.5°、152.9°、210°
正弦信号直流分量-0.5,频谱分析直流分量为-0.497

注意 :频率为0Hz时对应的直流信号的幅值的正负号,是通过零频相位来确定的,相位为0°表示幅值为正,相位为180°表示幅值为负。

**3.5 **含有随机干扰的正弦信号

%% Eg 5 含有随机干扰的正弦信号
ts = 0.01;
t = 0:ts:2;
A = [1 0.5];    % 幅值  
f = [3 10];         % 频率
w = 2*pi*f;             % 角频率
phi = (1:2)*pi/3;       % 初始相位 
x =  A(1)*cos(w(1)*t+phi(1)) + A(2)*cos(w(2)*t+phi(2)) + 0.8*(rand(size(t))-0.5);     % 时域信号
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

图片

图片

结果

正弦信号频率为3、10Hz,频谱分析频率为2.985、9.95Hz
正弦信号幅值为1、0.5,频谱分析幅值为0.978、0.456
正弦信号相位为60°、135°,频谱分析相位为65.1°、139.8°

**3.6 **实际案例

load data
ts = 0.001;
x = Jsd;
t = [0:length(x)-1]*ts;
figure
plot(t,x)
xlabel('时间/s')
ylabel('时域信号x(t)')
% DFT变换将时域转换到频域,并绘制频谱图
[f,X_m,X_phi] = DFT(x,ts);

图片

图片

结果

频谱分析主要频率成分为18.996、37.992Hz
频谱分析主要频率成分对应幅值为1.741、1.117

该项目为作者在强振环境下测得加速度信号,加速度是机械结构周期运动激励产生,需要通过频谱分析获取机械结构周期运动的频率。由于噪声幅度远大于有效信号幅度,信号的信噪比很低,从时域上很难辨别机械结构周期运动的频率。但经过DFT后,从频域上可以看出信号的主要频率成分为19Hz和其倍频38Hz,可以判断机械结构周期运动的频率为19Hz,38Hz为结构响应的非线性特性所产生的倍频。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 频谱分析仪
    +关注

    关注

    16

    文章

    1128

    浏览量

    85283
  • MATLAB仿真
    +关注

    关注

    4

    文章

    176

    浏览量

    19922
  • 傅里叶变换
    +关注

    关注

    6

    文章

    441

    浏览量

    42592
  • 倍频器
    +关注

    关注

    8

    文章

    76

    浏览量

    35520
  • DFT算法
    +关注

    关注

    0

    文章

    27

    浏览量

    7535
收藏 人收藏

    评论

    相关推荐

    用FFT对信号进行频谱分析的实验

    应用FFT对信号进行频谱分析实验实验二 应用FFT对信号进行频谱分析一、 实验目的1、在理论学习的基础上,通过本次实验,加深对快速傅里叶变换的理解,熟悉FFT算法及其程序的编写。2、熟悉应用FFT
    发表于 05-12 01:51

    图像频率域分析傅里叶变换

    文章目录傅里叶变换基础傅里叶级数傅里叶积分傅里叶变换一维连续傅里叶变换一维离散傅里叶变换二维离散
    发表于 05-22 07:41

    快速傅里叶变换C语言实现

    快速傅里叶变换C语言实现 模拟采样进行频谱分析FFT是DFT的快速算法用于分析确定信号(时间连续可积信号、不一定是周期信号)的频率(或相位、此处不研究相位)成分,且
    发表于 07-20 06:01

    离散傅里叶变换DFT在电阻网络分析中到底起到什么作用

    看到一篇博文中对于无限电阻网络求解相邻节点阻抗中使用了离散傅里叶变换 (DFT) 的方法比较新颖。分析DFT在其中仅仅是起到描述线性时不变
    发表于 08-19 15:59

    离散傅里叶变换及其快速算法

    离散傅里叶变换及其快速算法离散傅里叶变换 (Discrete Fourier Transform,DFT)是时间函数是
    发表于 10-30 12:54 33次下载

    应用FFT对信号进行频谱分析

    实验 应用FFT对信号进行频谱分析一、 实验目的1、在理论学习的基础上,通过本次实验,加深对快速傅里叶变换的理解,熟悉FFT算法及其程序的编写。2、熟悉
    发表于 05-10 10:00 64次下载

    离散傅里叶变换(DFT)

    第3章--离散傅里叶变换(DFT)
    发表于 12-28 14:23 0次下载

    离散傅里叶变换(DFT)及其快速算法(FFT)

    第2章-离散傅里叶变换(DFT)及其快速算法(FFT)
    发表于 12-28 14:23 0次下载

    非周期信号的频谱分析傅里叶变换

    非周期信号的频谱分析傅里叶变换
    发表于 12-06 14:30 0次下载

    使用DFT分析离散信号频谱的实验资料免费下载

    应用离散傅里叶变换DFT),分析离散信号x[k]的频谱。深刻理解
    发表于 08-06 17:16 12次下载
    使用<b class='flag-5'>DFT</b><b class='flag-5'>分析</b><b class='flag-5'>离散</b>信号<b class='flag-5'>频谱</b>的实验资料免费下载

    利用MATLAB进行频分析的方法和步骤

    Matlab可以说是一个非常有用且功能齐全的工具,在通信、自控、金融等方面有广泛的应用本文讨论使用 Matlab对信号进行频分析的方法说到频域,不可避免的会提到
    发表于 07-30 10:27 4次下载
    <b class='flag-5'>利用</b><b class='flag-5'>MATLAB</b><b class='flag-5'>进行频</b>域<b class='flag-5'>分析</b>的方法和<b class='flag-5'>步骤</b>

    什么是实时频谱分析仪呢?傅里叶变换(FFT)如何实现频谱测量?

    什么是实时频谱分析仪呢?傅里叶变换(FFT)如何实现频谱测量? 实时频谱分析仪是一种用于测量信号频谱的仪器。它能够将信号的时域信息转化为
    的头像 发表于 01-19 15:50 2981次阅读

    如何使用傅立叶变换进行频谱分析

    使用傅里叶变换进行频谱分析是一个复杂但强大的过程,它允许我们了解信号在频率域中的特性。以下是一个使用傅里叶变换进行频谱分析的基本步骤: 一、
    的头像 发表于 12-06 16:58 371次阅读

    如何使用DFT进行频谱分析

    使用离散傅里叶变换DFT进行频谱分析是一个将信号从时域转换到频域,并分析信号在频域上的特性的过程。以下是使用
    的头像 发表于 12-20 09:16 183次阅读

    DFT离散时间傅里叶变换的关系 DFT在无线通信中的应用

    DFT离散时间傅里叶变换(DTFT)的关系 DFT离散傅里叶变换)与DTFT(
    的头像 发表于 12-20 09:21 245次阅读