我是靠谱客的博主 从容热狗,最近开发中收集的这篇文章主要介绍matlab的fft与dsp联合开发,【安富莱——DSP教程】第27章 FFT的Matlab实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本帖最后由 baiyongbin2009 于 2015-4-11 10:58 编辑

特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接

第27章FFT的Matlab实现

本章主要讲解fft,ifft和fftshift在matlab上的实现。

27.1 FFT函数

27.2 IFFT函数

27.3 FFTSHIFT函数

27.4 总结

27.1FFT函数27.1.1语法

Y = fft(x)

Y = fft(X,n)

Y = fft(X,[],dim)

Y = fft(X,n,dim)27.1.2定义

Y = fft(x) 和 y = ifft(X)分别用于实现正变换和逆变换,公式描述如下:

851f1456299fc7e6d0742f2ae7c162b4.gif

27.1.png (17.07 KB, 下载次数: 5)

2015-4-11 10:51 上传27.1.3描述

Y = fft(x)

此函数用于返回向量x的离散傅立叶变换(DFT),计算时使用快速傅里叶算法(fast Fourier transform (FFT))。

如果输入X是一个矩阵,Y = fft(X)返回该矩阵的每列的傅里叶变换。

如果输入X是一个多维数组,实现第一个尺寸不为1的维度的FFT变化,注意这里第一个尺寸不为1是指一个矩阵的第一个尺寸不为1的维。

比如一个矩阵是2*1,那么第一个尺寸不为1的维就是行(尺寸为2)

X是 1*2*3表示第一个尺寸不为1的维就是列(尺寸为2)

X为维数5*6*2的话,第一个尺寸不为1的维就是行(尺寸为5))

Y = fft(X,n)

此函数用于返回n点的DFT。fft(n)和fft(X,n)是等同的,其中n是向量X中第一个尺寸不为1的维度。如果X的长度小于n,则X的长度通过填充零达到长度为n。如果X的长度大于n,序列X被截断。当X是一个矩阵,各列的长度都以相同的方式进行调整。

Y = fft(X,[],dim)

Y = fft(X,n,dim)

上面两个函数用于实现指定维度的FFT运算。27.1.4FFT实例一:幅频响应

傅里叶变换的一个常见用途就是查找埋藏在噪声信号中的实际信号的频率成分。下面我们考虑一个这样的例子:

采样率是1000Hz ,信号由如下三个波形组成。

(1)50Hz的正弦波、振幅0,7。

(2)70Hz正弦波、振幅1。

(3)均值为0的随机噪声。

实际运行代码如下:

Fs = 1000;          %采样率

T = 1/Fs;           %采样时间单位

L = 1000;           %信号长度

t = (0

sweat.gif-1)*T;        %时间序列

x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);  %原始信号

y = x + 2*randn(size(t));     %原始信号叠加了噪声后

plot(Fs*t(1:50),y(1:50));      %绘制波形

title('原始信号+零均值随机噪声 ');

xlabel('时间单位:ms');

运行Matlab后,显示波形如下:

851f1456299fc7e6d0742f2ae7c162b4.gif

27.2.png (6.4 KB, 下载次数: 5)

2015-4-11 10:51 上传

通过上面的截图,我们是很难发现波形中的频率成分,下面我们通过FFT变换,从频域观察就很方便了,Matlab运行代码如下:

Fs = 1000;         %采样率

T = 1/Fs;           %采样时间单位

L = 1000;          %信号长度

t = (0

sweat.gif-1)*T;       %时间序列

x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);  %原始信号

y = x + 2*randn(size(t));    %原始信号叠加了噪声后

NFFT = 2^nextpow2(L);  %求得最接近采样点的2^n,由于上面是1000点,那么最近的就是1024点。

Y=fft(y,NFFT)/L;          % 进行FFT变换,除以总的采样点数,方便观察实际值。

f = Fs/2*linspace(0,1,NFFT/2+1); %频率轴,这里只显示Fs/2部分,另一半是对称的。

plot(f,2*abs(Y(1:NFFT/2+1))) %绘制波形

title('幅频相应');

xlabel('频率');

ylabel('幅度');

851f1456299fc7e6d0742f2ae7c162b4.gif

27.3.png (6.96 KB, 下载次数: 6)

2015-4-11 10:51 上传

从上面的幅频相应,我们可以看出,两个正弦波的频谱并不是准确的0.5和1,而是比较接近,这个就是咱们在上节教程中所示的频谱泄露以及噪声的干扰。27.1.5FFT实例二:相频响应

这里我们以采样率=256Hz采样信号1.5*sin(2*pi*50*t+pi/3),并求出其幅频和相频响应,Matlab上面运行的代码如下:

Fs = 256;              % 采样率

N  = 256;             % 采样点数

n  = 0:N-1;            % 采样序列

t  = 0:1/Fs:1-1/Fs;     % 时间序列

f = n * Fs / N;          %真实的频率

x = 1.5*sin(2*pi*50*t+pi/3) ;  %原始信号

y = fft(x, N);    %对原始信号做FFT变换

Mag = abs(y);    %求FFT转换结果的模值

subplot(2,1,1);

plot(f, Mag);       %绘制幅频相应曲线

title('幅频相应');

xlabel('频率/Hz');

ylabel('幅度');

subplot(2,1,2);

plot(f,  angle(y)*180/pi);   %绘制相频响应曲线,注意这将弧度转换成了角度

title('相频响应');

xlabel('频率/Hz');

ylabel('幅度');

运行后求出的幅频相应和相频响应结果如下:

851f1456299fc7e6d0742f2ae7c162b4.gif

27.4.png (8.65 KB, 下载次数: 5)

2015-4-11 10:51 上传

最后

以上就是从容热狗为你收集整理的matlab的fft与dsp联合开发,【安富莱——DSP教程】第27章 FFT的Matlab实现的全部内容,希望文章能够帮你解决matlab的fft与dsp联合开发,【安富莱——DSP教程】第27章 FFT的Matlab实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部