
关于matlab如何用fft的讨论正在各大平台持续发酵,我们精心筛选了最新资讯,希望能为您带来实质性的帮助。
matlab自带的fft函数是快速傅里叶变换函数。主要用于降噪处理,通过使用傅里叶变换求噪声中隐藏的信号的频率分量。
该函数使用方法:
方法一:
Y?= fft(X)?用快速傅里叶变换 (FFT) 算法计算?X?的离散傅里叶变换?(DFT)。
如果?X?是向量,则?fft(X)?返回该向量的傅里叶变换。
如果?X?是矩阵,则?fft(X)?将?X?的各列视为向量,并返回每列的傅里叶变换。
如果?X?是一个多维数组,则?fft(X)?将沿大小不等于 1 的第一个数组维度的值视为向量,并返回每个向量的傅里叶变换。
方法二:
Y?= fft(X,n)?返回?n?点 DFT。如果未指定任何值,则?Y?的大小与?X?相同。
如果?X?是向量且?X?的长度小于?n,则为?X?补上尾零以达到长度?n。
如果?X?是向量且?X?的长度大于?n,则对?X?进行截断以达到长度?n。
如果?X?是矩阵,则每列的处理与在向量情况下相同。
如果?X?为多维数组,则大小不等于 1 的第一个数组维度的处理与在向量情况下相同。
我们通过下例,来了解fft函数使用过程:
第一步、指定信号的参数,采样频率为 1 kHz,信号持续时间为 1.5 秒。
Fs=1000;%采样频率
T=1/Fs;%采样周期
L=1500;%信号长度
t=(0:L-1)*T;%时间向量
第二步、构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量。
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
第三步、用均值为零、方差为 4 的白噪声扰乱该信号。
X = S + 2*randn(size(t));
第四步、在时域中绘制含噪信号。通过查看信号 X(t) 很难确定频率分量。
plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)'),ylabel('X(t)')
第五步、计算信号的傅里叶变换。
Y = fft(X);
第六步、计算双侧频谱 P2, 计算单侧频谱 P1。
P2 = abs(Y/L);?
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1)
第七步、定义频域 f 并绘制单侧幅值频谱 P1
f = Fs*(0:(L/2))/L;
plot(f,P1)?
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)'),ylabel('|P1(f)|')
运行结果。
如果你只对[-0.5,0.5]之间的信号进行采样,那么你采的将会是常数1,这样做出的FFT应该是一个delta函数,也就是一个冲击,所以你应该采包括外边的值才能够反映出信号的特性。
这样结果没有任何问题,问题是你采样的值太少了,换句话说就是你采样的信号反映不出这是个门函数的特性来。
matlab里边是可以利用单边函数表示门函数的。你可以跑一下下边的程序,看一下门函数:
f(x)=heaviside(x+0.5)-heaviside(x-0.5);
ezplot(fx,[-1,1]);
而且matlab里边还有对符号表达式做傅里叶变换的函数fourier(),用法如下:
FX=fourier(fx);
ezplot(FX,[-30,30]);
title('fourier transformation of fx')
而如果你非想用fft做,就必须加大采样点数,尤其是门之外的部分,才能够完整的描述信号。
函数(function)表示每个输入值对应唯一输出值的一种对应关系。这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素。函数f中对应输入值的输出值x的标准符号为f(x)。包含某个函数所有的输入值的集合被称作这个函数的定义域,包含所有的输出值的集合被称作值域。若先定义映射的概念,可以简单定义函数为,定义在非空数集之间的映射称为函数。
傅里叶变换能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。
fft能分辨的最高频率为采样频率的一半(即Nyquist频率),函数fft返回值是以Nyqusit频率为轴对称的,Y的前一半与后一半是复数共轭关系。
FFT(快速傅里叶变换)是利用复数形式的离散傅里叶变换来计算实数形式的离散傅里叶变换,matlab中的fft()函数是实现该算法的实现。这种算法可以减少计算DFT的时间,大大提高了运算效率,并曾经一度被认为是信号分析技术划时代的进步。
扩展资料:
例子程序:
clear all ? %清除内存所有变量
close all %关闭所有打开的图形窗口
%% 执行FFT点数与原信号长度相等(100点)
% 构建原信号
N=100; ?% 信号长度(变量@@@@@@@)
Fs=1; ?% 采样频率
dt=1/Fs; ?% 采样间隔
t=[0:N-1]*dt; ?% 时间序列
xn=cos(2*pi*0.24*[0:99])+cos(2*pi*0.26*[0:99]); ?
xn=[xn,zeros(1,N-100)]; ?% 原始信号的值序列
subplot(3,2,1) ?% 变量@@@@@@@
plot(t,xn) ?% 绘出原始信号
xlabel('时间/s'),title('原始信号(向量长度为100)') ?% 变量@@@@@@@
% FFT分析
NN=N; ?% 执行100点FFT
XN=fft(xn,NN)/NN; ?% 共轭复数,具有对称性
f0=1/(dt*NN); ?% 基频
f=[0:ceil((NN-1)/2)]*f0; ?% 频率序列
A=abs(XN); ?% 幅值序列
subplot(3,2,2),stem(f,2*A(1:ceil((NN-1)/2)+1)),xlabel('频率/Hz') ?% 绘制频谱(变量@@@@@@@)
axis([0 0.5 0 1.2]) ?% 调整坐标范围
title('执行点数等于信号长度(单边谱100执行点)'); ?% 变量@@@@@@@
%% 执行FFT点数大于原信号长度
% 构建原信号
N=100; ?% 信号长度(变量@@@@@@@)
Fs=1; ?% 采样频率
dt=1/Fs; ?% 采样间隔
t=[0:N-1]*dt; ?% 时间序列
xn=cos(2*pi*0.24*[0:99])+cos(2*pi*0.26*[0:99]); ?
xn=[xn,zeros(1,N-100)]; ?% 原始信号的值序列
subplot(3,2,3) ?% 变量@@@@@@@
plot(t,xn) ?% 绘出原始信号
xlabel('时间/s'),title('原始信号(向量长度为100)') ?% 变量@@@@@@@
% FFT分析
NN=120; ?% 执行120点FFT(变量@@@@@@@)
XN=fft(xn,NN)/NN; ?% 共轭复数,具有对称性
f0=1/(dt*NN); ?% 基频
f=[0:ceil((NN-1)/2)]*f0; ?% 频率序列
A=abs(XN); ?% 幅值序列
subplot(3,2,4),stem(f,2*A(1:ceil((NN-1)/2)+1)),xlabel('频率/Hz') ?% 绘制频谱(变量@@@@@@@)
axis([0 0.5 0 1.2]) ?% 调整坐标范围
title('执行点数大于信号长度(单边谱120执行点)'); ?% 变量@@@@@@@
%% 执行FFT点数与原信号长度相等(120点)
% 构建原信号
N=120; ?% 信号长度(变量@@@@@@@)
Fs=1; ?% 采样频率
dt=1/Fs; ?% 采样间隔
t=[0:N-1]*dt; ?% 时间序列
xn=cos(2*pi*0.24*[0:99])+cos(2*pi*0.26*[0:99]); ?
xn=[xn,zeros(1,N-100)]; ?% 原始信号的值序列
subplot(3,2,5) ?% 变量@@@@@@@
plot(t,xn) ?% 绘出原始信号
xlabel('时间/s'),title('原始信号(向量长度为120)') ?% 变量@@@@@@@
% FFT分析
NN=120; ?% 执行120点FFT(变量@@@@@@@)
XN=fft(xn,NN)/NN; ?% 共轭复数,具有对称性
f0=1/(dt*NN); ?% 基频
f=[0:ceil((NN-1)/2)]*f0; ?% 频率序列
A=abs(XN); ?% 幅值序列
subplot(3,2,6),stem(f,2*A(1:ceil((NN-1)/2)+1)),xlabel('频率/Hz') ?% 绘制频谱(变量@@@@@@@)
axis([0 0.5 0 1.2]) ?% 调整坐标范围
title('执行点数等于信号长度(单边谱120执行点)'); ?% 变量@@@@@@@
百度百科-快速傅里叶变换
关于matlab如何用fft的探讨就到这里,您是否还有其他想了解的内容?欢迎在评论区留言告诉我们,同时别忘了点击关注哦!