matlab仿真 模拟调制(上)

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第五章内容,有兴趣的读者请阅读原书)

1.幅度调制

Matlab 复制代码
clear all
ts=0.0025;  %信号抽样时间间隔
t=0:ts:10-ts;%时间矢量
fs=1/ts;%抽样频率
df=fs/length(t); %fft的频率分辨率
%msg=randint(100,1,[-3,3],123)
msg=randi([-3,3],100,1);%生成消息序列
msg1=msg*ones(1,fs/10);%扩展成取样信号形式
msg2=reshape(msg1.',1,length(t));
Pm=fft(msg2)/fs%除以fs才是模拟信号的实际频谱
f=-fs/2:df:fs/2-df;
subplot(2,1,1)
plot(f,fftshift(abs(Pm)))%画出消息信号频谱
title('消息信号频谱')

A=4;
fc=100;%载波频率
Sam=(A+msg2).*cos(2*pi*fc*t);%已调信号
Pam=fft(Sam)/fs;%已调信号频谱
subplot(2,1,2)
plot(f,fftshift(abs(Pam)))
title('AM信号频谱')
axis([-200 200 0 23])

Pc=sum(abs(Sam).^2)/length(Sam);%已调信号功率
Ps=Pc-A^2/2;%消息信号功率
eta=Ps/Pc;%调制效率

首先是生成消息序列时的操作,我们生成的是模拟信号,所以要进行采样转化为数字信号

这里我们每隔0.1秒产生一个符号,时间长度为10s,所以一共产生100个符号,又因为采样时间为0.0025,所以我们每个符号都采样40次(0.1/0.0025),采样40次的效果就是每个序号在采样之后都出现了40次重复的情况(这里用ones实现了该效果)

将采样后的信号通过矩阵变换转成行向量。这就是采样后的数字信号。

由于时间有限,simulink的仿真内容之后有空再补

Matlab 复制代码
clear all
ts=0.0025;  %信号抽样时间间隔
t=0:ts:5-ts;%时间矢量
fs=1/ts;%抽样频率

%msg=randint(100,1,[-3,3],123)
msg=randi([-3,3],10,1);%生成消息序列
msg1=msg*ones(1,fs/2);
msg2=reshape(msg1.',1,length(t));
subplot(3,1,1)
plot(t,msg2)
title('消息信号')
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 
A=4;
fc=100;
Sam=(A+msg2).*cos(2*pi*fc*t);

dems=abs(hilbert(Sam))-A;%包络检波,并且去掉直流分量
    
subplot(3,1,2)
plot(t,dems)%画出解调后的信号
title('无噪声的解调信号')

y=awgn(Sam,20,'measured');%调制信号通过AWGN信道
dems2=abs(hilbert(y))-A;%包络检波,并且去掉直流分量
subplot(3,1,3)
plot(t,dems2)
title('信噪比为20dB时的解调信号')
Matlab 复制代码
clear all
ts=0.0025;  %信号抽样时间间隔
t=0:ts:10-ts;%时间矢量
fs=1/ts;%抽样频率
df=fs/length(t); %fft的频率分辨率
%msg=randint(100,1,[-3,3],123)
msg=randi([-3,3],100,1);%生成消息序列
msg1=msg*ones(1,fs/10);%扩展成取样信号形式
msg2=reshape(msg1.',1,length(t));
Pm=fft(msg2)/fs%除以fs才是模拟信号的实际频谱
f=-fs/2:df:fs/2-df;
subplot(2,1,1)
plot(f,fftshift(abs(Pm)))%画出消息信号频谱
title('消息信号频谱')

A=4;
fc=100;%载波频率
Sdsb=msg2.*cos(2*pi*fc*t);%已调信号
Pdsb=fft(Sdsb)/fs;%已调信号频谱
subplot(2,1,2)
plot(f,fftshift(abs(Pdsb)))
title('DSBSC信号频谱')
axis([-200 200 0 2])

Pc=sum(abs(Sdsb).^2)/length(Sdsb);%已调信号频谱
Ps=sum(abs(msg2).^2)/length(msg2);%消息信号功率

和AM的思路一样,都是先生成消息序列,后构建数字信号

Matlab 复制代码
clear all
ts=0.0025;
t=0:ts:5-ts;
fs=1/ts;
df=fs/length(t);
f=-fs/2:df:fs/2-df;
msg=randi([-3,3],10,1);%生成消息序列
msg1=msg*ones(1,fs/2);%扩展成取样信号的形式
msg2=reshape(msg1.',1,length(t));

subplot(3,1,1)
plot(t,msg2)
title('消息信号')

fc=100;
Sdsb=msg2.*cos(2*pi*fc*t);%已调信号
y=Sdsb.*cos(2*pi*fc*t);%相干解调
Y=fft(y)./fs;%解调后的频谱
f_stop=100;%设计低通滤波器
n_stop=floor(f_stop/df);%
Hlow=zeros(size(f));
Hlow(1:n_stop)=2;
Hlow(length(f)-n_stop+1:end)=2;
DEM=Y.*Hlow;%通过点乘的方式使信号通过滤波器
dem=real(ifft(DEM))*fs;%最终得到的解调信号,因为刚开始构建的是实数信号,所以需要对DEM取实部。
subplot(3,1,2)
plot(t,dem);
title('无噪声的解调信号')

y1=awgn(Sdsb,20,'measured');
y2=y1.*cos(2*pi*fc*t);
Y2=fft(y2)./fs;
DEM1=Y2.*Hlow;
dem1=real(ifft(DEM1))*fs;
subplot(3,1,3)
plot(t,dem1)
title('信噪比为20dB时的解调信号')

在构建低通滤波器时,思路如下(pi处是高频,2pi处是低频)

Matlab 复制代码
clear all
ts=0.0025;
t=0:ts:10-ts;
fs=1/ts;
df=fs/length(t);
f=-fs/2:df:fs/2-df;
msg=randi([-3,3],100,1);%生成消息序列
msg1=msg*ones(1,fs/10);%扩展成取样信号的形式
msg2=reshape(msg1.',1,length(t));
Pm=fft(msg2)/fs;
f=-fs/2:df:fs/2-df;
subplot(2,1,1)
plot(f,fftshift(abs(Pm)))
title('消息信号的频谱')

fc=100;%载波频率
Sdsb=msg2.*cos(2*pi*fc*t);%DSB信号
Pdsb=fft(Sdsb)/fs;%DSB信号频谱

f_stop=100;%低通滤波器的截止频率
n_stop=floor(f_stop/df);%floor向下取整函数
Hlow=zeros(size(f));%设计低通滤波器
Hlow(1:n_stop)=1;
Hlow(length(f)-n_stop+1:end)=1;
Plssb=Pdsb.*Hlow;%LSSB信号频谱
subplot(2,1,2)
plot(f,fftshift(abs(Plssb)))
title('已调信号频谱')
axis([-200 200 0 2])

Slssb=real(ifft(Plssb))*fs;
Pc=sum(abs(Slssb).^2)/length(Slssb)%已调信号功率
Ps=sum(abs(msg2).^2)/length(msg2)%消息信号功率

这次的代码是用滤波法实现单边带信号的,滤波的思路如下图

Matlab 复制代码
clear all
ts=0.0025;
t=0:ts:10-ts;
fs=1/ts;
df=fs/length(t);
f=-fs/2:df:fs/2-df;
msg=randi([-3,3],100,1);%生成消息序列
msg1=msg*ones(1,fs/10);%扩展成取样信号的形式
msg2=reshape(msg1.',1,length(t));
Pm=fft(msg2)/fs;
f=-fs/2:df:fs/2-df;
subplot(2,1,1)
plot(f,fftshift(abs(Pm)))
title('消息信号的频谱')

fc=100;
s1=0.5.*msg2.*cos(2*pi*fc*t);%DSB信号
hmsg=imag(hilbert(msg2));%imag返回虚部
s2=0.5*hmsg.*sin(2*pi*fc*t);
Sussb=s1-s2;        
Pussb=fft(Sussb)/fs;
subplot(2,1,2)
plot(f,fftshift(abs(Pussb)))
title('USSB信号频谱')
axis([-200 200 0 2])

Pc=sum(abs(Sussb).^2)/length(Sussb)
Ps=sum(abs(msg2).^2)/length(msg2)

这里hilbert取虚部的原因是因为,matlab中的hilbert变换是返回一个复数序列,其实部是原序列,而虚部才是要求的Hilbert变换。

Matlab 复制代码
clear all
ts=0.0025;
t=0:ts:5-ts;
fs=1/ts;
df=fs/length(t);
f=-fs/2:df:fs/2-df;
msg=randi([-3,3],10,1);%生成消息序列
msg1=msg*ones(1,fs/2);%扩展成取样信号的形式
msg2=reshape(msg1.',1,length(t));
Pm=fft(msg2)/fs;
f=-fs/2:df:fs/2-df;
subplot(3,1,1)
plot(t,msg2)
title('消息信号的频谱')

fc=300;
s1=0.5.*msg2.*cos(2*pi*fc*t);%DSB信号
hmsg=imag(hilbert(msg2));%imag返回虚部
s2=0.5*hmsg.*sin(2*pi*fc*t);
Sussb=s1-s2; 
y=Sussb.*cos(2*pi*fc*t);
Y=fft(y)./fs;
f_stop=100;
n_stop=floor(f_stop/df);
Hlow=zeros(size(f));
Hlow(1:n_stop)=4;
Hlow(length(f)-n_stop+1:end)=4;
DEM=Y.*Hlow;
dem=real(ifft(DEM))*fs;
subplot(3,1,2)
plot(t,dem);
title('无噪声的解调信号')

y1=awgn(Sussb,20,'measured');
y2=y1.*cos(2*pi*fc*t);
Y2=fft(y2)./fs;
DEM1=Y2.*Hlow;
dem1=real(ifft(DEM1))*fs;
subplot(3,1,3)
plot(t,dem1)
title('信噪比为20dB时的解调信号')

与DSB解调思路相同 ,都是相干解调后经过低通滤波器,取实部

相关推荐
wuk9989 小时前
MATLAB双树复小波变换(DTCWT)工具包详解
人工智能·计算机视觉·matlab
机器学习之心9 小时前
PINN预测圆形区域内的二维声场MATLAB实现
matlab·pinn·二维声场
可编程芯片开发11 小时前
基于扰动观测MPPT控制器的单相无变压器光伏阵列并网发电系统simulink建模与仿真
simulink·mppt·光伏阵列·扰动观测·并网发电
tyatyatya17 小时前
如何在MATLAB中进行数据可视化?
matlab·信息可视化·数据分析
软件算法开发1 天前
基于秃鹰搜索优化的LSTM深度学习网络模型(BES-LSTM)的一维时间序列预测算法matlab仿真
深度学习·算法·matlab·lstm·时间序列预测·秃鹰搜索优化·bes-lstm
子不语1801 天前
Matlab(一)——绘图
开发语言·matlab
RaLi和夕2 天前
Matlab创建传递函数,绘制零极点图1
matlab
wuk9983 天前
基于Matlab的彩色图像特征提取实现
人工智能·计算机视觉·matlab
yong99903 天前
基于互信息的Matlab多模态医学图像配准实现
开发语言·matlab
Evand J3 天前
【TCN与LSTM例程】TCN(时间卷积网络)与LSTM(长短期记忆)训练单输入单输出,用于拟合一段信号,便于降噪。MATLAB
网络·人工智能·matlab·lstm