前言
本文仅限昆明理工大学开设的数字信号处理及DSP应用的MATLAB结果分享。文章部分内容可能有错误,仅代表个人观点。
本文先探讨前三个实验研究的问题和解决过程。
实验一 离散信号分析
1.1 实验目的
1.观察常用离散时间信号的图形,掌握离散时间信号的基本序列运算。
2.理解离散时间系统的时域特性,加深对离散时间系统的差分方程的理解。
1.2 实验内容
1.在给出的区间上产生并画出下面序列:
(1) ,
(2),
画两个离散时间序列,先用赋值语句设置序列,再用stem函数绘制离散时间序列。
%% 任务一
%第一问
n = 1:1:21; %设置序列x的总范围
x1_1(n) = n .* ( heaviside(n) - heaviside(n - 10) ) + 10 .* exp(-0.3 .* (n - 10)) .* (heaviside(n - 10) - heaviside(n - 20)); %设置序列x的内容
figure
subplot(2,1,1)
stem(n-1, x1_1);
%第二问
n = -10:1:9;%设置序列x的总范围
for i = n %设置序列内容
x1_2(i + 11) = 5 - mod(i, 5);
end
subplot(2,1,2)
stem(n, x1_2);
简单的离散时间序列绘制,不需要太多的解释,单位阶跃信号heaviside函数在今年6月的信号与系统B实验中就已经用过了,这里不多讲述。
2.给出一个简单数字微分器:
,它计算输入序列的后向一阶差分。对下面三角脉冲序列实现上述微分器并求出结果。![x(n)=n[u(n)-u(n-10)]+(20-n)[u(n-10)-u(n-20)]](https://latex.youkuaiyun.com/eq?x%28n%29%3Dn%5Bu%28n%29-u%28n-10%29%5D+%2820-n%29%5Bu%28n-10%29-u%28n-20%29%5D)
很明显,这里的简单数字微分器就是对序列x(n)进行一阶差分的运算。差分时注意序列的范围和差分区域。
%% 任务二
n = -10:1:30; n1 = -10:1:29; n2 = -9:1:30; %设置序列x的总范围和差分范围
x2(n+11) = n .* (heaviside(n) - heaviside(n - 10)) + (20 - n) .* (heaviside(n - 10) - heaviside(n - 20)); %设置序列x的内容
figure
subplot(2,1,1)
stem(n, x2);
y(n2+11) = x2(n2+11) - x2(n1+11);
y(1) = x2(1); %对序列进行简单数字微分(一阶差分)
subplot(2,1,2)
stem(n, y);
差分对于离散时间信号就是微分对于连续时间信号。差分也分为向前差分、向后差分和中心差分,题目给出的要求是当前项减前项,属于是向后差分。向前差分是后项减当前项、中心差分是后项减前项再除以2.
1.3 实验步骤
1. 实验内容1的程序运行结果如下图所示:
2. 实验内容2的程序运行结果如下图所示:
这两部分就不展示了,与本人画出的结果大同小异。
1.4 实验思考题
1. 分析单位脉冲序列和单位阶跃序列的特点,使用它们描述离散时间信号,各有什么好处?
单位脉冲序列代表瞬态特性,单位阶跃信号代表持续特性。利用单位脉冲信号描述离散时间信号,可以了解系统的线性特性、稳定性以及动态性能;利用单位阶跃信号输入到离散时间系统中,可以通过其响应了解系统的稳态特性和动态性能。
2. 简述序列的加法、乘法、移位、点乘等运算的计算过程。
序列的加法和点乘遵循按位相加或相乘的原则。序列的位移是指序列中的所有项向左或向右移动固定的位数。序列的乘法即是序列的卷积和。
实验二 信号采样
2.1 实验目的
1.验证奈奎斯特采样定理。
2.加深对时域取样后信号频谱变化的认识。
2.2 实验内容
假设有模拟信号为:,如果以
,
和
的时间间隔进行采样,可以得到
。
1.针对每一个
取值,画出相应的
。
模拟信号在MATLAB中可以理解成是函数。因此利用syms函数定义模拟信号,在通过不同的采样频率得到不同的取值。
%% 起始
dt = 0.001; dt1 = 0.01; dt2 = 0.05; dt3 = 0.1; %设置取样周期
syms t;
x(t) = cos(20 .* pi .* t); %设置函数
figure
subplot(4,1,1);
fplot(t, x, [0 1])
title("原函数")
%% 任务一
%取样周期0.01秒
subplot(4,1,2)
hold on
title("取样周期0.01秒")
fplot(t, x, [0 1])
for i = 0:dt1:1
plot(i, x(i), 'ro');
x1(fix(i / dt1 + 1)) = double(subs(x, t, i));
end
hold off
%取样周期0.05秒
subplot(4,1,3)
hold on
title("取样周期0.05秒")
fplot(t, x, [0 1])
for i = 0:dt2:1
plot(i, x(i), 'ro');
x2(fix(i / dt2 + 1)) = double(subs(x, t, i));
end
hold off
%取样周期0.1秒
subplot(4,1,4)
hold on
title("取样周期0.1秒")
fplot(t, x, [0 1])
for i = 0:dt3:1
plot(i, x(i), 'ro');
x3(fix(i / dt3 + 1)) = double(subs(x, t, i));
end
hold off
这里为了看得清楚,先把原函数图像输出,再通过打圈来标识,得到输出结果:
2.采用sinc内插(用
)从样本
重建模拟信号
。
sinc函数与Sa函数表达式相同,。由于sinc函数在时域上是无限长的,实际使用中需要截断。可以简单的for循环暴力插值,高级一点的可以用矢量化和FFT快速傅里叶变换求解。
%% 任务二
ct = 0:dt:1;
n1 = 0:1/dt1; n2 = 0:1/dt2; n3 = 0:1/dt3;
y1 = zeros(size(ct)); y2 = zeros(size(ct)); y3 = zeros(size(ct)); %初始化函数
for i = 1:length(ct) %利用sinc进行差值
y1(i) = sum(x1 .* sinc((ct(i) - n1*dt1) / dt1));
y2(i) = sum(x2 .* sinc((ct(i) - n2*dt2) / dt2));
y3(i) = sum(x3 .* sinc((ct(i) - n3*dt3) / dt3));
end
figure
subplot(3,1,1)
plot(ct, y1)
title("取样周期0.01秒重建模拟")
subplot(3,1,2)
plot(ct, y2)
title("取样周期0.05秒重建模拟")
subplot(3,1,3)
plot(ct, y3)
title("取样周期0.1秒重建模拟")
这样的运算结果与预期相差的有点大,但是也确实是验证了奈奎斯特采样定理:
2.3 实验步骤
1. 实验内容1的程序运行结果如下图所示:
2. 实验内容2的程序运行结果如下图所示:
由于内容2的结果与预期相差较大,因此放出内容2的预期效果。预期效果可能是用矢量优化的FFT做的,适合数据量大的sinc插值。
2.4 实验思考题
1. 在分析理想采样的实验中,当采样频率不同时,得到的采样序列有何差异?
当采样频率足够高时,采样序列能够较好地保留原始序列的特征,但是能量消耗大;当采样频率降低时,采样序列可能无法准确反映原始序列的高频成分,导致频谱混叠现象加剧,序列完整性受损。
2. 理想采样有哪些局限性,在实际应用中如何进行修正?
首先是存在高频噪声,受到了奈奎斯特采样定理的约束,采样频率应不小于信号最高频率的两倍,采样能量受到限制;由此获得的理想信号数据量大,存储与传输受到限制
实验三 离散信号的卷积运算
3.1 实验目的
1.理解线性卷积和,掌握线性卷积和的求解方法。
2.理解循环卷积和,掌握循环卷积和的求解方法并对照线性卷积比较二者异同。
3.2 实验内容
1. 求序列
,
的线性卷积,并用stem函数作图。
卷积的运算,包括卷积和与卷积积分的运算在MATLAB中都能用conv函数实现,在今年6月的信号与系统B实验中就已经用过了,这里不多讲述。单位冲激序列也还是用布尔型转数值得到的。
%% 任务一
n1 = 0:1:9; n2 = 0:1:3; nq = 0:1:12; %设置长度
x1_1(n1+1) = 0.8 .^ n1;
x1_2(n2+1) = (n2 == 0) + (n2 == 2); %设置序列内容
x1 = conv(x1_1, x1_2); %线性卷积
figure
subplot(3,1,1)
stem(n1, x1_1);
axis([-1 10 -0.1 1.1])
title('序列x1(n)')
subplot(3,1,2)
stem(n2, x1_2);
axis([-1 4 -0.1 1.1])
title('序列x2(n)')
subplot(3,1,3)
stem(nq, x1);
axis([-1 13 -0.1 2.1])
title('线性卷积结果')
注意卷积前后的序列长度,还是很容易的。
2. 求序列
和
的线性卷积和6点、10点以及12点循环卷积,画出线图并总结出线性卷积和循环卷积的关系。
循环卷积是周期卷积的一种。不同于线性卷积,循环卷积考虑到的周期信号的周期边界,更适合处理周期性信号。通常可以利用DFT的循环卷积性质,计算DFT来实现循环卷积。
%% 任务二
x2_1(1:5) = [1 2 3 4 5];
x2_2(1:6) = [-1 3 0 -2 -2 1]; %设置序列内容
y2 = conv(x2_1, x2_2); %线性卷积
yc6 = ifft(fft(x2_1, 6) .* fft(x2_2, 6)); %6点循环卷积
yc10 = ifft(fft(x2_1, 10) .* fft(x2_2, 10));%10点循环卷积
yc12 = ifft(fft(x2_1, 12) .* fft(x2_2, 12));%12点循环卷积
figure
subplot(2,3,1)
stem(1:5, x2_1);
axis([0 6 0 6])
title('序列x1(n)')
subplot(2,3,2)
stem(1:6, x2_2);
axis([0 7 -3 5])
title('序列x2(n)')
subplot(2,3,3)
stem(1:10, y2);
axis([0 11 -16 16])
title('线性卷积结果')
subplot(2,3,4)
stem(1:6, yc6);
axis([0 7 -16 16])
title('6点循环卷积结果')
subplot(2,3,5)
stem(1:10, yc10);
axis([0 11 -16 16])
title('10点循环卷积结果')
subplot(2,3,6)
stem(1:12, yc12);
axis([0 13 -16 16])
title('12点循环卷积结果')
循环卷积结果序列的长度是可以指定的:n点循环卷积的结果序列长度就是n。
3.3 实验步骤
1. 实验内容1的程序运行结果如下图所示:
2. 实验内容2的程序运行结果如下图所示:
这两部分就不展示了,与本人画出的结果大同小异。
3.4 实验思考题
1.写出线性卷积和的公式,简述线性卷积和的计算过程。
线性卷积公式:。将卷积序列翻转并平移,与被卷积序列按位遍历相乘并相加。
2.写出循环卷积和的公式,简述循环卷积和的计算过程。
循环卷积公式:。将有限长的两序列扩展成周期为N的周期序列,其中的卷积序列翻转并平移,在一个周期内与被卷积序列按位遍历相乘求余并相加,得到定长的离散序列。
结论
全文全部是本人一个人完成,存在错误,允许指正,不允许因为本人专业程度低而出现对本人的诋毁、骂人等现象。
技术是开拓、完善、传承的过程。开拓的过程是艰苦,完善的过程是漫长的,传承的过程是延续的。愿技术能在传承的基础上开拓,能在开拓的道路上完善,能在完善的成果中继承,生生不息,永无止尽!
感谢阅读。