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解调思路相同 ,都是相干解调后经过低通滤波器,取实部

相关推荐
孤亭远见2 小时前
COMSOL with Matlab
matlab
图南楠4 小时前
simulink离散传递函数得到差分方程并用C语言实现
matlab
信号处理学渣4 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
机器学习之心16 小时前
Bayes-GRU-Attention的数据多特征分类预测Matlab实现
matlab·分类·gru
叶庭云16 小时前
Matlab 和 R 语言的数组索引都是从 1 开始,并且是左闭右闭的
matlab·编程语言·r·数组索引·从 1 开始
γ..18 小时前
基于MATLAB的图像增强
开发语言·深度学习·神经网络·学习·机器学习·matlab·音视频
IT猿手21 小时前
基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码
算法·elk·机器学习·matlab·无人机·聚类·强化学习
超级大咸鱼1 天前
CW信号的正交解调
matlab·verilog·fpga·数字信号·解调·正交解调·cw
乌恩大侠2 天前
画图,matlab,
开发语言·matlab
吐泡泡科技2 天前
无人机视频传输系统的通信能耗优化
matlab·通信能耗·无人机通信