学习笔记之——基于matlab的数字通信系统(2)之离散信号的傅里叶分析

关于连续信号的傅里叶分析,可以参考博文《学习笔记之——基于matlab的数字通信系统(1)&连续信号的傅里叶分析

目录

离散时间信号的傅里叶变换(DTFT)

连续时间信号的抽样——抽样定理

离散傅里叶级数(DFS)——离散的周期序列的傅里叶级数

离散傅里叶变换(DFT)

快速傅里叶变换FFT

代码

参考文献


离散时间信号的傅里叶变换(DTFT)

先给出课本的解析

对于DTFT有如下特点:

1、是离散的,所以变换需要求和而不是积分。

2、是w的连续函数;且是w的周期函数,周期为2pi

3、可以看作将在频域展开为傅里叶级数,傅里叶

DTFT的重要性质:

 

连续时间信号的抽样——抽样定理

实际种,信号的抽样是通过A/D芯片来实现将连续信号变成数字信号。通过抽样,将连续信号的x(t)变为数字信号x(nTs),将x(t)的傅里叶变换变为

抽样函数为,其对应的傅里叶变换为

对于信号采样,有公式:

根据时域卷积定理,有:

经运算后有:

将连续信号抽样变为离散信号,对应的离散信号的频谱将变成周期的。而变成周期的方法就是进行频谱的周期延拓。如下图所示:

进而得出抽样定理:

离散傅里叶级数(DFS)——离散的周期序列的傅里叶级数

离散傅里叶变换(DFT)

在计算机上实现频谱分析及其他方面的处理工作时,对信号的要求是:在时域和频域上都应该是离散的。在四种傅里叶变换种,只有DFS在时域和频域上都说离散的,但是却都是无限长的

对于DFS有

在DFS种,n和k仍取无穷长,但实际上并没有必要,因为他们都是以N点(采样点)为周期的。故此有:

显然,DFT并不是一种新的傅里叶变换,它实际上是来自于DFS,只不过它仅仅在时域和频域各取一个周期而已。

快速傅里叶变换FFT

代码

DTFT

N=8;                         %原离散信号有8点
n=[0:1:N-1]                  %原信号是1行8列的矩阵
syms t;
xn=0.5.^n;f=0.5.^t                   %构建原始信号,为指数信号
subplot(311);
ezplot(f);
title('原始信号(指数信号)');

subplot(312)
stem(n,xn);
title('原始信号(离散化),');

w=[-800:1:800]*4*pi/800;     %频域共-800----+800 的长度(本应是无穷,高频分量很少,故省去)    
X=xn*exp(-j*(n'*w));         %求dtft变换,采用原始定义的方法,对复指数分量求和而得

subplot(313);
plot(w/pi,abs(X));
title('DTFT变换')

clear all
%%%%%%%%%%%%%%%%
n1=-15:15;
h1=exp(-abs(0.1*n1));
subplot(2,2,1);stem(n1,h1);title('h1');
%%%%%%%%%%%%%%%%%%%%%%%
n2=0:20;
h2(n2+1)=1;
subplot(2,2,2);stem(n2,h2);title('h2');

w=-4:0.001:4;%产生要计算的w的范围
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Hjw1=h1*(exp(-j*pi).^(n1'*w));
subplot(2,2,3);plot(w,abs(Hjw1))
title('H1');xlabel('pi弧度(w)');ylabel('振幅')
%%%%%%%%%%%%%%%%%%%%%%%%%%%
Hjw2=h2*(exp(-j*pi).^(n2'*w));
subplot(2,2,4);plot(w,abs(Hjw2));
title('H2');xlabel('pi弧度(w)');ylabel('振幅')

%%%%%%%非周期离散信号的DTFT是——周期性,且连续的

验证卷积定理

clear all
n=0:30;
h=sinc(0.2*n);
subplot(3,3,1);stem(n,h);title('系统的时域响应')
x=2*sin(0.2*pi*n)+3*cos(0.4*pi*n);
subplot(3,3,2);stem(n,x);title('系统的输入')
%%%%%%%%%%%%%%%%%%%DTFT
w=-1:0.001:1;%%%要计算的频率的范围
Hjw=h*(exp(-j*pi).^(n'*w));
subplot(3,3,4);plot(w,abs(Hjw))
title('系统的频域响应');xlabel('pi弧度(w)');ylabel('振幅')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Xjw=x*(exp(-j*pi).^(n'*w));
subplot(3,3,5);plot(w,abs(Xjw));
title('系统的输入的频域');xlabel('pi弧度(w)');ylabel('振幅')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Yjw=Xjw.*Hjw;
%%%%%%%%%%%%%%%%%
subplot(3,3,6);plot(w,abs(Yjw));
title('系统的输出的频域');xlabel('pi弧度(w)');ylabel('振幅')


n1=0:2*length(n)-2;%%%%%%%%计算IDTFT
dw=0.001*pi;%%%%%%%%%%分段求和来实现积分
y=(dw*Yjw*(exp(j*pi).^(w'*n1)))/(2*pi);
subplot(3,3,7);stem(abs(y));title('通过IDTFT计算出的输出序列Y');

y1=conv(x,h);
subplot(3,3,9);stem(abs(y1));title('通过时域卷积计算出的输出序列Y1')



DFT变换

clear all
n=0:30;%%%%%%%%n的范围
x=sin(0.2*n).*exp(-0.1*n);
subplot(2,1,1);stem(n,x);title('序列x')
k=0:30;
N=31;
Wnk=exp(-j*2*pi/N).^(n'*k);%%%%%%DFT定义
X=x*Wnk;
subplot(2,1,2);stem(-15:15,[abs(X(17:end)) abs(X(1:16))])%%%%%%%%对坐标进行了对称排列
title('X的DFT')

上面的都是直接采用原始的定义公式。在matlab中有FFT函数。

DFT的循环卷积

clear all
%%%%%%产生两个信号序列
h=[6 3 4 2 1 -2];
x=[3 2 6 7 -1 -3];

h1=fliplr(h);%%%%%%%%对序列进行翻转
H=toeplitz(h,[h(1) h1(1:5)]);%%%%%%%%%%%生成循环矩阵
y=H*x';%%%%%%%计算循环卷积序列
%%%%%%%%%%%%FFT
H=fft(h);
X=fft(x);
Y=H.*X;
y1=ifft(Y);

subplot(2,1,1);stem(y);title('直接计算')
subplot(2,1,2);stem(y1);title('DFT计算')

clear all
n1=0:20;
n2=0:10;
h=sinc(0.2*n1);
x=exp(-0.2*n2);
y=conv(x,h);

h1=[h zeros(1,length(x)-1)];
x1=[x zeros(1,length(h)-1)];
H1=fft(h1);
X1=fft(x1);
Y1=H1.*X1;
y1=ifft(Y1);

subplot(2,1,1);stem(y);title('直接计算')
subplot(2,1,2);stem(y1);title('DFT计算')

参考文献

https://www.cnblogs.com/cezorzhao/archive/2013/03/24/2978686.html(用matlab对信号进行傅里叶变换)

发布了208 篇原创文章 · 获赞 198 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/gwplovekimi/article/details/102872927