DFT做频谱分析再理解

DFT再理解

2015.12.18

       之前学习《信号与系统》的时候,对于用fft()函数分析离散、连续时间信号的频谱出来的结果一直一知半解,这学期学习了《数字信号处理》,学习了离散傅里叶变换(DFT),对之前的写的程序做进一步理解。

       在此之前,先将CTFS、DTFS、CTFT、DTFT的公式列出来,方便理解:


注意:这里计算离散周期信号的傅里叶系数的公式前面少了一个N分之一,下面也会涉及到。

 

(一) 用DFT分析离散非周期信号的频谱(离散非周期的DTFT为连续周期的,以2*pi为周期)

比较DTFT和DFT公式可以发现:


N点DFT是DTFT结果在[0,2*pi]周期内N点采样;

所以,分析离散非周期信号的频谱的思路如下:

(1)    对已知的信号进行截短(如果本来就是有限长的则不用);

(2)    对截短的离散信号做N点DFT(这里的N应该大于离散信号的点数,N越大,在频域的采样就越密集);

(3)    将横坐标转换为【-pi,pi】,符合实际的情况(/N*2*pi)。

具体的解释见下面的代码(具体代码粘贴在最后面)。

下面是一个例子:


运行结果如下:


 

(二)  用DFT分析离散周期信号的频谱(离散周期信号的DTFS为离散周期的,以基波周期N为周期)

比较DTFS和DFT公式,可以发现:


如上面提到的,上面的DTFS公式与实际的相差了N倍,所以在画频谱的时候需要考虑进去。

离散周期信号的基波周期为N,取其中N点做N点DFT相当于离散周期信号DTFS的一个N周期内的值。

所以,分析离散周期信号的频谱的思路如下:

(1)    确定基波周期N;

(2)    取离散周期信号的N个点,如【0,N-1】;

(3)    做N点DFT(幅度上要除以N,原因在DTFS公式比DFT公式前面多了一项1/N);

(4)    得到离散周期信号在一个基波周期内的傅里叶系数;

 

下面是一个例子: 

 

(三)  用DFT分析连续非周期信号的频谱(连续非周期信号的CTFT为连续非周期的)

利用采样,将连续非周期信号,转换成离散非周期信号,对得到的离散非周期信号做DFT,类似于(一),最后再利用模拟频率与数字频率的关系(模拟频率乘以采样周期等于数字频率)将横坐标由数字频率转换为模拟频率:


分析连续非周期信号的频谱的思路如下:

(1)    根据需要截短(如果连续信号是无限长的);

(2)    估计信号的最高频率fm;

(3)    采样频率fs>2*fm;

(4)    按T(T=1/fs)对连续信号进行采样;

(5)    对采样后的信号(相当于离散非周期信号)做N点DFT(此处的N应该大于等于采样点数,而且越大越好,越大代表如(一)分析的,在频域上的采样就越密集,对离散非周期信号的频谱更好地逼近),DFT结果幅度上要除以T,这是采样导致的结果;

(6)    将横坐标转换成模拟频率(/N*2*pi*fs)。

下面是一个例子:

 


(四)  用DFT分析连续周期信号的频谱(连续周期信号的CTFS为离散非周期)

对连续周期信号在一个或多个基波周期长度内进行采样,采样频率fs>2*fm,对采样点做等长(假设为N)的DFT(幅度上得除以N,原因同(二)),由于用了采样,所以同(三)一样需要将数字频率转换成模拟频率(/N*2*pi*fs)。

分析连续周期信号的频谱的思路如下:

(1)    确定基波周期To和最高频率fm,采样频率fs>2*fm;

(2)    对连续周期信号的一个周期(可以多个周期)以频率fs进行均匀采样,采样点数为N;

(3)    对采样点做N点DFT(幅度/N,原因同(二));

(4)    将横坐标转换成模拟频率(/N*2*pi*fs)。

下面是一个例子:






全部代码:

function test1

%%%%%%%%(1)离散非周期%%%%%%%%%%%%% x = 0.8.^n;(频谱为连续周期(周期为2*pi))

N = 31;%%%%%无限长的信号应根据需要先截断

n = 0:N-1;

x = 0.8.^n;

X = fft(x,N);%%%%%%对截断的离散信号做N点DFT相当于在其频谱的【0,2pi】区间做N点均匀采样

figure;

subplot(3,1,1);

stem(n,x);

subplot(3,1,2);

plot([-(N-1)/2:(N-1)/2],abs(fftshift(X)));%%%%%%此处画出来的频谱图的横坐标是对离散非周期信号的实际频谱在[-pi,pi]区间采样的点

subplot(3,1,3);

plot([-(N-1)/2:(N-1)/2]./N*2*pi,abs(fftshift(X)));%%%%%%此处将频谱的横坐标转化为[-pi,pi]区间,这才是实际情况(离散非周期信号的DTFT是连续周期的,以2pi为周期)

 

%%%%%%(2)离散周期%%%%%%%%%%%%% x =cos(pi/8*n+pi/3)+0.5cos(7*pi*n/8);(频谱为离散周期(周期为基波周期N))

%%%%%%%%确定信号的基波周期为16

N = 16;

n = 0:N-1;

x = cos(pi/8*n+pi/3)+0.5*cos(7*pi*n/8);

X = fft(x,N)/N;%%%%%%对截断的离散信号做N点DFT,得出的结果相当于是原周期信号在【0,N-1】的傅里叶系数,除以N表示DFT公式与离散周期信号傅立叶级数公式的关系所需;

figure;

subplot(3,1,1);

stem(n,x);

subplot(3,1,2);

stem([-N/2:N/2-1],abs(fftshift(X)));%%%%%%此处画出来的频谱图的横坐标是离散周期信号的CTFS(傅里叶系数,以N为周期),在[-N/2:N/2-1]的变化,即谐波次数(基波周期N=16的情况下)

subplot(3,1,3);

stem([-N/2:N/2-1]./N*2*pi,abs(fftshift(X)));%%%%%%此处画出来的频谱图的横坐标是将上面的谐波次数乘上基波频率2*pi/N

 

%%%%%%(3)连续非周期%%%%%%%%%%%%% x = exp(-1*t);(频谱为连续非周期)

%%%%%%取x的最高频率fm为25,根据奈奎斯准则,采样率取100>2*25

%%%%%此处的信号无限长,同样需要进行截短,这里去前6秒

fs = 100;

Tp = 6;

T = 1/fs;

t = 0:T:Tp;

x = exp(-1*t);

N = 1024;%%%%%%%进行DFT的点数,这里的N只要比采样点数多即可,越大越能够逼近

X = fft(x,N)*T;%%%%%%此处乘上T是由于对连续信号采样导致的频谱幅度变化。

subplot(2,1,1);

plot(t,x);

subplot(2,1,2);

%%%%%%此处画出来的频谱图的横坐标是[-N/2:N/2-1]*(2*pi/N)是对采样得到的离散非周期信号做频谱分析得到的数字角频率,乘上fs即除以采样周期T才得到模拟角频率

plot([-N/2:N/2-1]*(2*pi/N)*fs,abs(fftshift(X)));

 

 

%%%%%%%(4)连续周期%%%%%%%%%%%%% x =cos(10*pi*t)+2*cos(18*pi*t);(频谱为离散非周期)

%%%%%%%因为x的基波频率为2*pi,基波周期Tp为1s,最高次谐波为9,即最高频率为9Hz

%%%%%%%由奈奎斯采样准则确定出采样频率fs=20>2*9

fs = 20;

T = 1/fs;

Tp = 1;

N = Tp/T;

t = 0:T:Tp-T;

x = cos(10*pi*t)+2*cos(18*pi*t);

X = fft(x,N)/N;

subplot(2,1,1);

plot(t,x);

subplot(2,1,2);

stem([-N/2:N/2-1]/N*fs,abs(fftshift(X)));%%%%%%此处画出来的频谱图的横坐标是[-N/2:N/2-1]*(2*pi/N)是对采样得到的离散非周期信号做频谱分析得到的数字角频率,乘上fs即除以采样周期T才得到模拟角频率

 

 

 

 

  • 12
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值