所谓信号的谱分析,就是时频域转换,变成数学知识,就是对信号进行傅立叶变换(FT),连续信号与系统的傅立叶变换不便于用计算机进行计算。而在Matlab中的绘图 *** 作,是通过将一些离散的点连接而成。求连续信号的频谱,应用的是离散傅立叶变换(DFT)。
下面这段程序是绘制简单的Sa函数时域和频域图像。
Sa(t)=sin(200t)/200t
对于这个函数我们要说明一点。由傅立叶变换理论知道,若信号持续时间有限长,则其频谱无限宽;若信号频谱有限宽,则其持续时间无限长。因此要对其进行谱分析就必须在时域采样无穷多个点,这又显然不满足DFT变换的要求。从工程实际角度来看,滤除幅度很小的高频成分和截去幅度很小的部分时间信号是允许的,因此这里我们截取(-5≤t≤5)时间段的Sa(t)。下面是程序代码:
Sam
Clear
t0=10; %定义时间长度10s,即(-5≤t≤5)
ts=0001; fs=1/ts; %定义采样周期、采样频率
df=05; %定义频谱分辨率(见说明1)。
t=[-t0/2:ts:t0/2]; %定义时间序列
--------------------------------------------------------------------------------------------------
%定义函数Sa(t):
x=sin(200t);
m=x/(200t);
w=t0/(2ts)+1; %由于sin(t)/t在t=0时Matlab会得出值NaN,所以需要加以修正。
m(w)=1;
---------------------------------------------------------------------------------------------------
�T变换:
[M,mn,dfy]=fftseq(m,ts,df); %对序列m进行DFT,fftseq()为自定义函数,代码在下面。
M=M/fs; %频率缩放
f=[0:dfy:dfylength(mn)-dfy]-fs/2; %定义频率轴,将频谱搬移到0频附近。
----------------------------------------------------------------------------------------------------
%绘图:
pause;
subplot(2,1,1);
plot(t,m);
xlabel('时间');
axis([-015,015,-05,2]);
subplot(2,1,2);
plot(f,abs(fftshift(M))); �tshift见说明4
xlabel('频率');
axis([-50,50,0,002]);
-------------------------------------------------------------------------------------------
%序列的DFT函数
function[M,m,dfy]=fftseq(m,tz,df)
%m:时域序列
%tz:采样周期
�:变换所要求达到的最低频谱分辨率
%M:变换后的频域序列
�y:实际的频谱分辨率
%fz=1/tz;
if nargin==2 %nargin函数表示函数原参数的个
数,即看有没有要求频谱分辨率
n1=0;
else n1=fz/df; %n1表示满足频谱分辨率的最小采样点数
end
n2=length(m); %n2表示满足频域采样定理(见说明2)的最小采样点数。
n=2^(max(nextpow2(n1),nextpow2(n2)));
%n表示实际采样点数,取n1和n2二者中的大值,而且进行DFT变换时采用Matlab自带的FFT变换函数,因此需要n为2的幂次。Nextpow2()见说明3
M=fft(m,n);
dfy=fz/length(M); %实际的频谱分辨率=采样频率fz/实际采样点数length
从图中可以看出,在频率函数的拐角处有细微的波动,这是因为我们一开始说的,截取(-5≤t≤5)时间段做DFT产生的原因。
说明1:频谱分辨力----谱分析中能够分辨的两个频谱分量的最小间隔。N点DFT就是对信号的频谱在[0-fs](fs指采样频率)上的N点等间隔采样,那么频谱分辨率df=fs/N
说明2:频域采样定理----如果序列时域x(n)的长度为M,则只有当频域采样点数N≥M时,才可由频域采样X(k)恢复原序列x(n),否则产生时域混叠现象。
说明3:nextpow2(x)----取大于并最接近x的2次幂
说明4:matlab中的fftshift的功能是零频移到频谱中心,其实就是将一个数组的前一半和后一半对调。具体点说,做n(n为偶数)点FFT不用FFTSHIFT时,第1点对应的模拟频率是零频,第2点是Fs/n,第n/2+1点是Fs/2,第n点是Fs(n-1)/n。用FFTSHIFT后,将Fs/2到Fs(n-1)/n的频点,也就是第n/2+1点到第n点搬移到第1到第n/2点,将第1点到第n/2点搬移到第n/2+1到第n点。所以原来的第1点(模拟频率是零频)搬移到第n/2+1点。说晕了吧,看下面两幅图就明白了,前一个是没有进行fftshift变换的,后一个是进行fftshift变换之后的。
其实都一样,你要知道的是你的横坐标有问题。fft后,横坐标的最小间隔实际上是1/L,L是信号的宽度。例题中的 f 除了512,因为做的512个点的fft。如果改成其它的点数的fft,那么横坐标间隔也需要改。总之,结果除了fft带来的误差,应该是差不多的。纵坐标没有太多的意义,因为傅里叶变换前应该有系数的,matlab省略了系数,导致实际大小没有太多意义,但是两个频率对应的幅值比值表示这两个频率成分的占比。例题中两个频率的比例不为1:1是因为fft的误差,你取得t值越多,填零越多,则幅度大小应该接近1:1
DFT离散傅里叶变换,按照公式编写程序就是了。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>> n=1:50;
x=cos(n(pi/6));
N=12;
X=zeros(1,N);
sum=0;
for k=1:N
for ii=1:N
sum=sum+x(ii)exp(-i2pik/N);
end
X(k)=sum;sum=0;
end
stem(abs(X));
grid on
以上就是关于matlab怎么利用dft对连续信号逼近全部的内容,包括:matlab怎么利用dft对连续信号逼近、MATLAB中的y=fft(x)做的是几点的DFT、matlab作业:若x(n)=cos(npi/6)是一个N=12的有限序列,计算它的DFT并画出图形等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)