MATLAB——FFT(快速傅里叶变换)

这篇具有很好参考价值的文章主要介绍了MATLAB——FFT(快速傅里叶变换)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基础知识
FFT即快速傅里叶变换,利用周期性和可约性,减少了DFT的运算量。常见的有按时间抽取的基2算法(DIT-FFT)按频率抽取的基2算法(DIF-FFT)。

1.利用自带函数fft进行快速傅里叶变换
若已知序列 x = [ 4 , 3 , 2 , 6 , 7 , 8 , 9 , 0 ] x=[4,3,2,6,7,8,9,0] x=[4,3,2,6,7,8,9,0],求 X ( k ) = D F T [ x ( n ) ] X(k)=DFT[x(n)] X(k)=DFT[x(n)]
代码非常简单,只有两行

x=[4,3,2,6,7,8,9,0];
xk=fft(x)

matlab fft,MATLAB,matlab,算法,开发语言
一般,对MATLAB而言,要想让它显示出结果,计算的部分不要加分号。
2.绘制128点DFT的幅频图
已知信号由15Hz幅值0.5的正弦信号和40Hz幅值2的正弦信号组成,数据采样频率为100Hz,试绘制N=128点DFT的幅频图。
关于下列代码的解释

f=(0:N-1)'*fs/N;

其中(0:N-1)'是生成了一个长度为N,间隔为1的列向量转置所得到的行向量。fs/N是指频域上的频率间隔。
若N点序列x(n)(n=0,1,…,N-1)是在采样频率fs(Hz)下获得的。它的FFT也是N点序列,即X(k)(k=0,1,…,N-1),则第K点对应实际频率值为:
f=k*fs/N

clc;
fs=100;
Ts=1/fs;%采样时间间隔
N=128;
n=0:N-1;
t=n*Ts;    %x不是直接关于n的函数,因为是固定的采样时间点
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);

y=fft(x,N);
f=(0:N-1)'*fs/N;
stem(f,abs(y));

运行结果
matlab fft,MATLAB,matlab,算法,开发语言
同时也可以可看到这个幅度谱是关于fN对称的。
3.利用FFT进行功率谱的噪声分析
已知带有测量噪声信号 x ( t ) = s i n ( 2 π f 1 t ) + s i n ( 2 π f 2 t ) + 2 w ( t ) x(t)=sin(2πf1t)+sin(2πf2t)+2w(t) x(t)=sin(2πf1t)+sin(2πf2t)+2w(t) 其中f1=50Hz,f2=120Hz, w(t)为均值为零、方差为1的随机信号,采样频率为1000Hz,数据点数N=512。试绘制信号的功率谱图。
下面先介绍几个基本的函数和知识:
conj(Y)
conj(Y) 是 MATLAB 中的一个函数,表示对 Y 中的每个元素取其共轭复数。如果 Y 是一个实数数组,则返回其本身。在信号处理中,常常使用共轭复数进行频域变换的处理。
求功率
P=Y.*conj(Y)/512;
注意这里是点乘啊。
在信号处理中,功率可以表示为信号的平均能量。对于一个离散时间信号,其能量可以表示为其幅度平方的总和,即:
E = ∑ n = 0 N − 1 ∣ x [ n ] ∣ 2 E = \sum_{n=0}^{N-1} |x[n]|^2 E=n=0N1x[n]2
其中, N N N 是信号的抽样点数, x [ n ] x[n] x[n] 是信号在时刻 n n n 的采样值。这里的 ∣ x [ n ] ∣ 2 |x[n]|^2 x[n]2 表示对 x [ n ] x[n] x[n] 取模长平方。
如果要计算信号的平均功率,可以将其总能量除以抽样点数,即:
P = E N = 1 N ∑ n = 0 N − 1 ∣ x [ n ] ∣ 2 P = \frac{E}{N} = \frac{1}{N} \sum_{n=0}^{N-1} |x[n]|^2 P=NE=N1n=0N1x[n]2
这里的 P P P 表示信号的功率。
在代码中, Y Y Y 表示信号的离散傅里叶变换,即频域表示,其幅度 ∣ Y ∣ |Y| Y 表示信号在每个频率分量上的贡献。为了计算信号的功率谱,需要将 Y Y Y 变换为其幅度平方,即 ∣ Y ∣ 2 |Y|^2 Y2。由于 Y Y Y 中包含了正频率和负频率的信息,因此需要对其进行共轭操作,即将负频率部分取共轭复数,然后再与正频率部分相乘,即 Y ⋅ conj ⁡ ( Y ) Y \cdot \operatorname{conj}(Y) Yconj(Y)。最后将结果除以抽样点数 N N N,即可得到功率谱 P P P
P = Y ⋅ conj ⁡ ( Y ) N P = \frac{Y \cdot \operatorname{conj}(Y)}{N} P=NYconj(Y)
这里的 P P P 是一个长度为 N N N 的向量,表示信号在每个频率分量上的功率。
randn
andn是MATLAB中的一个函数,用于生成一个均值为0,方差为1的标准正态分布随机数。例如,可以使用以下代码生成一个大小为3x3的标准正态分布随机矩阵:
A = randn(3,3);
完整代码

clc;
t=0:0.001:0.6;%设置步进与时间区间
x=sin(2*pi*50*t)+sin(2*pi*120*t);%根据已知写出信号的表达式
noise=randn(1,length(t));%生成均值为零、方差为1的随机信号,也就是噪声
y=x+noise;%带有噪声的信号
subplot(121);
plot(t,y);

fs=1000;
Y=fft(y,512);%512点的FFT
P=Y.*conj(Y)/512;%求功率
f=(0:255)*fs/256%由上面的分析可知,频谱关于奈奎斯特频率对称,所以取其中一半
subplot(122);
plot(f,P(1:256))%功率随频率的变化,即功率谱图,绘制出一半

运行结果:
matlab fft,MATLAB,matlab,算法,开发语言
4.序列长度和FFT的长度对信号频谱的影响
已知信号 x ( t ) = 0.5 s i n ( 2 π f 1 t ) + 2 s i n ( 2 π f 2 t ) x(t)=0.5sin(2πf1t)+2sin(2πf2t) x(t)=0.5sin(2πf1t)+2sin(2πf2t)
其中f1=15Hz,f2=40Hz,采样频率为100Hz.
在下列情况下绘制其幅频谱。
有了前面的基础,这里就比较简单了
代码

nlength=32;
nfft1=32;
nfft2=128;
fs=100;
Ts=1/fs;
n=0:nlength-1;
t=n*Ts;

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);

y1=fft(x,nfft1);
f1=(0:31)*fs/32;
subplot(211);
Y1=abs(y1);
plot(f1(1:16),Y1(1:16));

y2=fft(x,nfft2);
f2=(0:127)*fs/128;
subplot(212);
Y2=abs(y2);
plot(f2(1:64),Y2(1:64));

运行结果
matlab fft,MATLAB,matlab,算法,开发语言
结果分析
采样点数越多,其频谱越光滑。
注意
绘制图形的时候,一定要分析清楚是频谱图,还是某一个变换,其目的在于分清谁是因变量,谁是自变量。文章来源地址https://www.toymoban.com/news/detail-778976.html

到了这里,关于MATLAB——FFT(快速傅里叶变换)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA:实现快速傅里叶变换(FFT)算法

    第一次使用FPGA实现一个算法,搓手手,于是我拿出一股势在必得的心情打开了FFT的视频教程,看了好几个视频和好些篇博客,于是我迷失在数学公式推导中,在一位前辈的建议下,我开始转换我的思维, 从科研心态转变为先用起来 ,于是我关掉我的推导笔记,找了一篇叫我

    2024年02月03日
    浏览(38)
  • 快速傅里叶变换——FFT

    1·为什么要进行傅里叶变换 傅里叶变换——进行信号的分解过程 时域信号——分解成一系列频率下的正弦//余弦信号(两者在相位上有所不同),一般情况下可以统称为正弦信号。  上图表示了傅里叶的变化过程。对于时域的信号,可以将其分解成一系列频域下的正弦信号,

    2024年02月10日
    浏览(35)
  • 适用于单片机的FFT快速傅里叶变换算法,51单片机都能用

    普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 算法来自FFT算法的使用说明与C语言版实现源码 —— 原作者:吉帅虎 速度更快的版本见C语言实现的FFT与IFFT源代码,不依赖特定平台 移植十分简单,不依赖其他库,可自定义点数 在FFT.h中修改 FFT_N 16,定义

    2024年02月11日
    浏览(34)
  • 快速傅里叶变换FFT学习笔记

    我们正常表示一个多项式的方式,形如 (A(x)=a_0+a_1x+a_2x^2+...+a_nx^n) ,这是正常人容易看懂的,但是,我们还有一种表示法。 我们知道, (n+1) 个点可以表示出一个 (n) 次的多项式。 于是,我们任意地取 (n+1) 个不同的值,表示 (x) ,求出的值与 (x) 对应,形成 (n+1) 个点

    2024年02月01日
    浏览(43)
  • 快速傅里叶变换(FFT)c语言实现

    基本原理在这里就不多讲了,可以看看其他高浏览量的博文,这篇文章针对c语言的实现         我们都知道C语言本身是没有复数运算的,很多DSP、单片机要用到也没有开源库可以使用复数运算,针对FFT在硬件上运行只能手动从底层开始 定义复数类型         这里用最简单

    2023年04月15日
    浏览(38)
  • 快速傅里叶变换(FFT)的频谱分辨率

    快速傅里叶变换Fast Fourier Transform (FFT)是快速计算离散傅里叶变换的一种算法,是我们在编程时进行傅里叶变换的主要方法。 FFT的输入与输出的个数一致,比如对于长度为1024的一维向量,其输出也为长度为1024的一维向量。而根据Nyquist-Shannon 采样定律,当采样率 为1Mhz(每秒

    2024年02月13日
    浏览(39)
  • Python中利用FFT(快速傅里叶变换)进行频谱分析

    本文将从实例的角度出发讲解fft函数的基本使用,不包含复杂的理论推导。 要对一个信号进行频谱分析,首先需要知道几个基本条件。 采样频率fs 信号长度N(信号的点数) 采样频率fs: 根据采样定理可知,采样频率应当大于等于被测信号里最高频率的2倍,才能保证不失真

    2024年01月17日
    浏览(40)
  • 基于STM32&FFT(快速傅里叶变换)音频频谱显示功能实现

    + v hezkz17进数字音频系统研究开发交流答疑 一实验效果   二 设计过程 要用C语言实现STM32频谱显示功能,可以按照以下步骤进行操作: 1 确保已经安装好了适当的开发环境和工具链,例如Keil MDK或者GCC工具链。 2 创建一个新的STM32项目,并选择适合的MCU型号。 3 配置GPIO引脚用

    2024年02月12日
    浏览(31)
  • 傅里叶变换(FFT)笔记存档

    参考博客:https://www.luogu.com.cn/blog/command-block/fft-xue-xi-bi-ji 目录: FFT引入 复数相关知识 单位根及其相关性质 DFT过程(难点) DFT结论(重要) IDFT结论(重要) IDFT结论证明(难点)

    2024年02月10日
    浏览(40)
  • FFT64点傅里叶变换verilog蝶形运算,代码和视频

    名称:FFT64点verilog傅里叶变换 软件:Quartus 语言:Verilog 代码功能:     使用verilog代码实现64点FFT变换,使用蝶形运算实现傅里叶变换 演示视频:http://www.hdlcode.com/index.php?m=homec=Viewa=indexaid=208 FPGA代码资源下载网:hdlcode.com 代码下载: 软件:Quartus 语言:Verilog 代码功能:

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包