篇一 : 傅里叶变换的Matlab代码与注释
傅里叶变换的Matlab代码与注释 收藏
%Data 为一维采样数组
% Fs 为采样频率
Data_length=length(Data);
% DFT需要的采样点数为2的幂指数,但是输入的点数有可能是一个一般整数,于是找一个离指定点数最近的2的幂指数用来做DFT
NFFT = 2^nextpow2(Data_length);
% 生成结果的x轴,即频域。正常出来的频谱是左右对称的,为便于处理只要前半个域。
F_domain = (Fs/2)*linspace(0,1,NFFT/2);
% FFT变换
Y = fft(Data,NFFT)/Data_length;
% 幅值
Amp =2*abs(Y(1:NFFT/2));
subplot(211);
plot(F_domain,Amp);
title('频谱')
xlabel('频率(Hz)')
ylabel('频谱幅值')
本文来自CSDN博客,转载请标明出处:/vastsmile/archive//07/11/5712210.aspx
篇二 : 从MATLAB帮助文档里扒下来的例子之——傅里叶变换用
傅里叶变换的一大用途是从混杂的时域信号中找出其中各频率成分的分布。
以一个由50Hz、120Hz两个频率正弦信号和随机噪声叠加得到的信号为例(采样频率1000Hz):
A common use of Fourier transforms is to find the frequency components of a signal buried in a noisy time domain signal. Consider data sampled at 1000 Hz. Form a signal containing 50 Hz and 120 Hz and corrupt it with some zero-mean random noise:
t = 0:0.001:0.6;
x = sin(2*pi*50*t)+sin(2*pi*120*t);
y = x + 2*randn(size(t));
plot(1000*t(1:50),y(1:50));
title('Signal Corrupted with Zero-Mean Random Noise');
xlabel('time (milliseconds)');
直接观察这个信号,我们看不出它是由哪些频率的正弦信号叠加而成。
对信号y作快速傅里叶变换得到它的离散频谱Y:
It is difficult to identify the frequency components by looking at the original signal. Converting to the frequency domain, the discrete Fourier transform of the noisy signal y is found by taking the 512-point fast Fourier transform (FFT):
Y = fft(y,512);
其能量谱(表明各个频率分量的能量大小)为:
The power spectrum, a measurement of the power at various frequencies, is
Pyy = Y.* conj(Y) / 512;
取前257个点,画出信号y的能量谱(这里我很困惑,为什么后面255个点就多余了?):
Graph the first 257 points (the other 255 points are redundant) on a meaningful frequency axis:
f = 1000*(0:256)/512;
plot(f,Pyy(1:257))
title('Frequency content of y')
xlabel('frequency (Hz)')
该图像表示信号y中从直流分量到奈奎斯特频率各频率分量的能量大小。从图上可以直观地看出信号的主要频率成分一个是50Hz,另一个在100Hz到150Hz之间,大约在120Hz处。
同时可以看到,这个图像上有明显的峰。
This represents the frequency content of y in the range from DC up to and including the Nyquist frequency. (The signal produces the strong peaks.)
篇三 : matlab的傅里叶变换实例
注:数学本非我专业,以下说法欢迎纠错1.傅里叶变换的定义傅里叶变换从数学上的定义,为F(w)=int(x*exp(-jwt),t=-inf...inf)其中,int表示积分,t是时间,x是时域信号,inf表示无穷,exp表示指数运算。其含义说的是给一个无限长的时域信号和一个频点w,可以唯一确定一个复数F。于是,F和w就有了这种对应关系,考虑到F是个复数。F的绝对值和w关系叫幅频,F的幅角和w关系叫相频。2.matlab的fft命令helpfft可以知道这个和数学上的傅里叶不一样,因为计算机是离散的!因为计算机的时域信号存储量是有限的!比如等时采样得到的信号,高频分量是不可能获得的,对于比较大的w将无法计算。于是,fft这样计算傅里叶变换:把时域信号进行周期延拓,取一组w,就是时域信号的周期及该周期的二分之一,三分之一,直到n分之一,其中n是一个周期内的采样点。这样做的结果,就是对一段有限长的时域信号,将其长度作为基频率,分析基频和高频含量。当然,能分析到的最高频为n次谐波,再高次谐波由于香农定理而无法体现。3.写一个数学定义傅里叶变换的程序
将有限长时域信号不延拓,时域信号外的时间内,认为信号为零。于是获得无限长时域信号,取频点若干,分析其傅里叶变换。考虑到matlab对于由描点法定义的函数,数值积分时常用的方法有:矩形法,梯形法。一下代码采用梯形法,算例如下:
clearclc%% 输入信号t=0:1e-3:20;%时域信号的时间范围x=sin(t)+sin(1.5*t+1)+5*cos(0.5*t)+2*randn(size(t));%时域信号xw=[0:1e-2:2];%想要观察的频率范围%% 预定义y=w;a=w;j=sqrt(-1);%先定义变量维度,提高运算速度%% 计算频点for i=1:length(w) f=trapz(t,x.*exp(-j*w(i)*t)); y(i)=abs(f); a(i)=angle(f);end%% 输出subplot(3,1,1),plot(t,x)subplot(3,1,2),plot(w,y)subplot(3,1,3),plot(w,a)
算例中的时域信号,里有三个正余弦分量,一个干扰分量。等时采样,并认为采样频率足够高,即得到的信号是连续信号。
篇四 : 傅里叶变换MATLAB程序
fs=51.2;
N=1024;
n=0:N-1;
t=n/fs;
x=0.5-0.5*sign(t-1);
Y=fft(x,N);
mag=abs(Y);
Y1=fftshift(Y);
mag1=abs(Y1);
fn2=(-N/10.24:N/10.24)*fs/N;
subplot(2,1,1)
plot(fn2,mag1((N/2-N/10.24+1):(N/2+N/10.24+1))); set(gca,'XTick',(-5:0.5:5));
set(gca,'YTick',(0:10:60));
xlabel('频率/Hz');ylabel('振幅');
title('图1:矩形函数的FFT结果,N=512,fs=51.2Hz'); grid on;
f=linspace(-5,5,1000);
y=sqrt(2-2*cos(2*pi*f))./abs((2*pi*f));
subplot(2,1,2)
plot(f,y);
set(gca,'XTick',(-5:0.5:5));
set(gca,'YTick',(0:0.2:1));
xlabel('频率/Hz');ylabel('振幅');
title('图2:矩形函数傅里叶变换的理论结果'); grid on
matlab傅里叶变换 傅里叶变换MATLAB程序
图1:矩形函数的FFT结果,N=512,fs=51.2Hz
60
50
40
振幅
振幅300-5-4.5-4-3.5-3-2.5-2-1.5-1-0.500.511.522.533.544.55频率/Hz图2:矩形函数傅里叶变换的理论结果10.8
0.60.4
0.2
0-5-4.5-4-3.5-3-2.5-2-1.5-1-0.500.511.522.533.544.55
频率/Hz