matlab怎么利用dft对连续信号逼近

matlab怎么利用dft对连续信号逼近,第1张

所谓信号的谱分析,就是时频域转换,变成数学知识,就是对信号进行傅立叶变换(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并画出图形等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10179170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存