基于MATLAB的数字信号处理第2章

1.离散序列

%Sample2_1
%%%%%%%%%%%%% stem 绘制离散序列,plot绘制函数 %%%%%%%%%%%%%
N=[-3 -2 -1 0 1 2 3 4 5 6 7 8 9 10];
X=[0 1 2 3 2 1 0 -1 -2 -3 -4 -5 1 2];
subplot(2,1,1), stem(N,X);
hold on; plot(N,zeros(1,length(X)),'k');
%绘制横轴,zeros(1,N)为产生1行N列元素值为0的数组
set(gca,'box','on'); %将坐标轴设置在方框上
xlabel('序列号');ylabel('序列值');
title('stem 例子');
dt=1;t=N*dt; %给出时间序列和时间间隔
subplot(2,1,2),plot(t,X);
hold on; plot(t,zeros(1,length(X)),'k');
xlabel('时间/s');ylabel('函数值');title('plot例子');

2.信号采样

%Sample2_2
clc;
clear all;
close all;
%f=9;
f=10;
dt=0.01;
t=0:dt:1;
x=sin(2*pi*f*t+0.3);
dt1=0.1;
t1=0:dt1:1;
x1=sin(2*pi*f*t1+0.3);

% subplot(3,1,1);
% plot(t,x);
% ylim([-1,1]);
% title('原信号');
% xlabel('时间/s');
% ylabel('振幅');
% 
% subplot(3,1,2);
% plot(t,x,t1,x1,'o');
% ylim([-1,1]);
% title('采样过程');
% xlabel('时间/s');
% ylabel('振幅');
% 
% subplot(3,1,3);
% plot(t1,x1);
% ylim([-1,1]);
% title('采样信号');
% xlabel('时间/s');
% ylabel('振幅');

    for fi=11:20
    x2=sin(2*pi*fi*t1+0.3);
    subplot(10,1,fi-10);
    plot(t1,x2);
    ylim([-1,1]);
    end

 3.指数序列

clc;
clear all;
close all;
n=0:10;
x=0.5.^n;
stem(n,x);
title('衰减指数');
xlabel('采样点/n');
ylabel('幅值');
grid on; %添加网格线

 4.正弦序列

%Sample2_4
clc;
clear all;
close all;
n=0:100;
x=2*sin(0.02*pi*n+pi/4);
stem(n,x);
xlabel('n'),ylabel('x(n)'),title('正弦序列'); %必要标记
grid on;

 

 

5.单位阶跃

%Sample2_5
n0=0;
n1=-10;
n2=10;

n=[n1:n2]; %给出序号序列
x=[(n-n0)>=0]; %给出值序列,注意只有当n-n0>=0时值才为1,否则为0
stem(n,x);
xlabel('n'),ylabel('x(n)'),title('阶跃序列');
grid on;

 6.离散斜坡

clc;
clear all;
close all;

t=0:0.1:1;
y=t;
stem(t,y);
xlabel('n');ylabel('x(n)');title('斜坡序列');
grid on;
  

7. 单位脉冲信号

%Sample2_7
clc;
clear all;
close all;
n0 =-10;
n1=0;
n2=10;
n = n0:n2; %序号序列
x=(n-n1)==0;
stem(n,x);
xlabel('n'),ylabel('x(n)'),title('脉冲序列');

 8.离散sinc信号

%Sample2_8
x=-10:0.1:10;
y=sin(pi*x+eps)./(pi*x+eps);%给出sinc函数的离散序列值,eps是matlab系统的精度,这里防止被0除
plot(x,y)
xlabel('t');
ylabel('sinc(t)');

 9.指数序列相关信息

%Sample2_9
clc;
clear all;
close all;

clf;
n=-10:10;
alpha=-0.1+0.3*j;
x=exp(alpha*n);
Real_x=real(x);
Image_x=imag(x);
Mag_x=abs(x);
Phase_x=(180/pi)*angle(x);

subplot(2,2,1),stem(n,Real_x);
title('实部');
xlabel('n');
ylabel('幅值');
grid on;

subplot(2,2,2),stem(n,Image_x);
title('虚部');
xlabel('n');
ylabel('幅值');
grid on;

subplot(2,2,3),stem(n,Mag_x);
title('振幅');
xlabel('n');
ylabel('幅值 ');
grid on;

subplot(2,2,4),stem(n,Phase_x);
title('相位');
xlabel('n');
ylabel('幅值 ');
grid on;

 10.随机信号

clc;
clear all;
close all;

n=1:10;
x1=rand(1,10);
subplot(2,1,1);
stem(n,x1);
ylim([0 1]);
title('rand随机数');
xlabel('n');
ylabel('幅值');
grid on;

x2=randn(1,10);
subplot(2,1,2);
stem(n,x2);
hold on;
plot(n,zeros(1,10));
ylim([-2, 2]);
title('randn随机数');
xlabel('n');
ylabel('幅值');
grid on;

 2.11.随机信号实现周期信号

clc;
clear all;
close all;

x=randn(1,20);
xp=[x,x,x,x,x];
subplot(2,1,1); plot(x);title('原始信号');
subplot(2,1,2); plot(xp);title('周期信号'); xlabel('n');
grid on;

 2.12.信号时移

function [y,n]=mySigshift(x,m,n0)
%执行信号移位:y(n)=x(n+n0)
%调用方式:[y,n]=mySIGSHIFT(x,m,n0)
n=m+n0;y=x;
% Sample2_12
t=0:0.001:1;
fo=2;f1=10;
x=chirp(t,fo,1,f1);
m=1:length(x);
subplot(2,1,1),plot((m-1)*0.001,x); %绘制原始随时间变化chrip信号,m为序号,因此必须减1与采样间隔相乘才能得到时间序列
xlim([0 1.5]),title('原始信号');
[y,n]=mySigshift(x,m,500);
subplot(2,1,2);
plot((n-1)*0.001,y);
xlim([0 1.5]), title('时移后信号'),xlabel('时间/s');

 2.13.信号折叠

function [y,n] = mySigfold(x,n)
%执行信号折叠 y(n) = x(-n)
%调用方式:[y,n]=mySIGFOLD(x,n);
y=fliplr(x);n=-fliplr(n);
clc;
clear all;
close all;
n=-10:10;
y1=exp(-n);
[y2 m]=mySigfold(y1,n);

subplot(2,1,1);
plot(n,y1);
line([0 0],ylim); %绘制y轴
title('原始信号');
xlabel('t/s');
grid on;

subplot(2,1,2);
plot(m,y2);
line([0 0],ylim); %绘制y轴
title('反转的信号');
xlabel('t/s');
grid on;

 2.14时域尺度变换

clc;
clear all;
close all;
dt=0.3;
n=-100:100;
t=n*dt;

x=sin(t);
subplot(3,1,1);
plot(t,x);
title('原信号');
xlabel('时间/s');

subplot(3,1,3);
x1=sin(2*t);
plot(t,x1);
title('压缩两倍');
xlabel('时间/s');

subplot(3,1,2);
x2=sin(1/2*t);
plot(t,x2);
title('拓宽两倍');
xlabel('时间/s');

 2.15.信号叠加

function [y,n] = mySigadd(x1,n1,x2,n2)
%执行信号相加 y(n) = x1(n) + x2(n)
%调用方式 [y,n] = mySIGADD(x1,n1,x2,n2)
%y:叠加后的信号序列,包括n1,n2
%x1:第一个信号序列,序列号为n1
%x2:第二个信号序列,序列号为n2(n1和n2可以不同)
n=min(min(n1),min(n2)):max(max(n1),max(n2));
% 得到y(n)信号序列的序列号范围
y1=zeros(1,length(n)); y2=y1;%初始化信号
%y1(find((n>=min(n1)) & (n<=max(n1))==1))=x1;
y1((n>=min(n1) & n<=max(n1))==1)=x1;
%将x1赋值给y对应位置的元素
%y2(find((n>=min(n2)) & (n<=max(n2))==1))=x2;
y2((n>=min(n2) & n<=max(n2))==1)=x2;
%将x2赋值给y对应位置的元素
y=y1+y2;%序列相加
%Sample2_15
f1=1;
f2=10;
n=1:200;
dt =0.01;
t = n*dt;

x1=sin(2*pi*f1*t);
x2=0.2*sin(2*pi*f2*t);
[x,t] = mySigadd(x1,n,x2,n);
%x=x1+x2;

subplot(3,1,1);
plot(t,x1);
title('x1波形');
xlabel('时间/s');
ylabel('幅值');

subplot(3,1,2);
plot(t,x2);
title('x2波形');
xlabel('时间/s');
ylabel('幅值');

subplot(3,1,3);
plot(t,x);
title('x波形');
xlabel('时间/s');
ylabel('幅值');

2.16. 信号微积分

clc;
clear all;
close all;
dt=0.01;
t=0:dt:4*pi;
y1=sin(t);
subplot(3,1,1);
plot(t,y1);
title('原始信号');

y2=diff(y1)/dt;
subplot(3,1,2);
plot(t,[0 y2]);
title('微分后信号');%因为微分信号比原始信号少一个元素, 所以用零补
for ii=1:length(y2)
    y3(ii)=sum(y2(1:ii))*dt;%将原始信号微分后的y2进行积分,积分并没有增加元素
end
subplot(3,1,3);
plot(t,[0 y3]);
title('积分信号');
xlabel('时间/s');

 17.信号乘

function [y,n] = mySigmult(x1,n1,x2,n2)
%执行信号相加 y(n) = x1(n) * x2(n)
%调用方式 [y,n] = myMULT(x1,n1,x2,n2)
%y:相乘后的信号序列,包括n1,n2
%x1:第一个信号序列,序列号为n1
%x2:第二个信号序列,序列号为n2(n1和n2可以不同)
n=min(min(n1),min(n2)):max(max(n1),max(n2));
% 得到y(n)信号序列的序列号范围
y1=zeros(1,length(n)); y2=y1;%初始化信号
%y1(find((n>=min(n1)) & (n<=max(n1))==1))=x1;
y1((n>=min(n1) & n<=max(n1))==1)=x1;
%将x1赋值给y对应位置的元素
%y2(find((n>=min(n2)) & (n<=max(n2))==1))=x2;
y2((n>=min(n2) & n<=max(n2))==1)=x2;
%将x2赋值给y对应位置的元素
y=y1.*y2;%序列相加
%Sample2_17
dt = 0.02;
df=1/(6000*dt); %采样间隔及信号长度为2分钟的频率分辨率
n=0:2999;%取前3000个数据进行操作
f=n*df;%给出频率序列
sig = rand(1,length(n));%运用随机函数产生信号频谱
filt=[ones(1,5/df),zeros(1,(length(n)-5/df))];%理性滤波器幅频响应函数
[y,n1]=mySigmult(filt,n,sig,n);%信号相乘相当于对信号滤波
subplot(3,1,1),plot(n*df,sig); %绘制出原始信号频谱
title('原始信号振幅谱');
subplot(3,1,2),plot(n*df,filt, 'LineWidth',3);%绘制滤波器幅频响应
title('滤波器频谱');
subplot(3,1,3),plot(n1*df,y);%绘制滤波后的振幅谱
title('滤波后的振幅谱'),xlabel('频率/Hz');

 18.信号分解为奇偶序列

function[xe,xo,n] = myEvenodd(x,n)
%将实序列信号分为基数部分和偶数部分
%调用方式[xe,xo,n] = myEvenodd(x,n)
%
if any(imag(x) ~=0)
    error('x is not a real sequence')
end;
m = -fliplr(n); %将序号仅从反转
m1=min([m,n]); m2=([m,n]); m=m1:m2;
%创建新的信号序列
nm=n(1)-m(1); n1=1:length(n);
x1=zeros(1,length(m)); %创建空序列
x1(n1+nm)=x;x=x1;
xe=0.5*(x+fliplr(x));%求得偶函数序列
xo=0.5*(x-fliplr(x));%求得基函数序列
%Sample2_18
clc;
clear all;
close all;
n0=0;
n1=-10;
n2=10;
n=[n1:n2];%序号序列
x=[(n-n0)>=0];%阶跃信号值序列
subplot(2,2,1);
stem(n,x);%绘制出阶跃信号
xlabel('n'),ylabel('x(n)'),title('阶跃序列');
grid on;
[xeven,xodd,m]=myEvenodd(x,n);
%进行奇偶分解得到偶序列xeven和奇序列xodd
subplot(2,2,2);
stem(m,xeven); %绘制 偶序列图
xlabel('m'),ylabel('xeven(m)'),title('偶函数部分');
grid on;
subplot(2,2,3);
stem(m,xodd); %绘制奇函数序列
xlabel('m'),ylabel('xodd(m)'),title('奇函数部分');
grid on;

 信号采样:

clc;
clear all;
close all;
f=30;
fs=50;
N=300;
dt=0.01;
n=0:N;
t=n*dt;
x1=sin(2*pi*f*t);
subplot(2,1,1);
plot(t,x1);
xlabel('t/s'),ylabel('振幅'),title('原始信号');
x2=sin(2*pi*f*t/fs);
subplot(2,1,2);
plot(t,x2);
xlabel('t/s'),ylabel('振幅'),title('采样信号');

 绘制信号波形:

clc
clear all;
close all;
n1=-10;
n2=10;
n0=0;
t=-10:0.01:10;

n=[n1,n2];
u=[(t-n0)>=0];
x1=((1/2).^t).*u;
x2=((-2).^t).*u;

[u1,n]=mySigshift(u,n,-1);
x3=(2.^t).*u1;
plot(t,x1);
hold on;
plot(t,x2);
hold on;
plot(t,x3);
legend('x1','x2','x3');
xlabel('时间/s');
ylabel('幅值');
title('阶跃处理的指数信号');

 绘制信号波形:

clc;
clear all;
close all;
n=-10:0.01:10;
x1=sin(n./10*pi-pi/4);
x2=0.5.*n+cos(5/7*pi.*n);
x3=exp(j*(n./8-pi));

plot(n,x1);
hold on;
plot(n,x2);
hold on;
plot(n,x3);

legend('x1','x2','x3');
xlabel('时间/s'),ylabel('幅值'),title('信号波形');

 绘制指数序列信息:

clc
clear all;
close all;
n=-10:10;
x=exp(0.1-i*0.3).*n;
Real_x=real(x);
Imag_x=imag(x);
Mag_x=abs(x);
Phase_x=(180/pi).*angle(x);

subplot(2,2,1);
stem(n,Real_x);
xlabel('n'),ylabel('幅值'),title('Real_x');

subplot(2,2,2);
stem(n,Imag_x);
xlabel('n'),ylabel('幅值'),title('Imag_x');

subplot(2,2,3);
stem(n,Mag_x);
xlabel('n'),ylabel('幅值'),title('Mag_x');

subplot(2,2,4);
stem(n,Phase_x);
xlabel('n'),ylabel('幅值'),title('Phase_x');

 

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值