AM调制与解调(matlab实现)

一、为什么要引入AM

引入 AM(幅度调制)调制与解调 是为了在通信系统中有效地传输信号。大部分原始信号(如语音、音频等)的频率范围较低,直接传输这些低频信号会受到传输距离质量的限制。通过调制,将低频信号的频率迁移到较高的载波频率上,而高频信号对干扰的抗性通常更强,因为许多自然噪声源的频率范围较低。

二、AM调制与解调的原理

1.AM调制原理

基带信号m(t)与直流分量A0相加,然后和高频载波相乘实现AM信号的调制。

2.AM解调原理 

AM信号经信道传输,引入噪声后,得到Sam'(t),再和载波相乘,经过低通滤波器,隔直流后会付出原始基带信号。

三、 matlab代码实现

1.AM.m文件,主文件

%AM调制过程
clc;close all;
%% 基本参数
fm = 100;                     %基带信号频率
T = 2;                        %信号持续2s
fs = 20000;                   %采样频率,满足奈奎斯特定理即可;
                              %这里取20倍为了绘制更多的细节,让时域信号更平滑
dt = 1/fs;                    %采样间隔
N = T/dt;                     %采样点数
t = 0:dt:dt*N-dt;             %横坐标时间轴

%% *****************调制信号的时域波形*****************
Am = 1;                       %调制信号幅值
mt = Am*cos(2*pi*fm*t);       %调制信号
figure(1);                    %创建一个新图形
subplot(3,2,1);               %创建3×2的子图集合,并在第一个位置显示
plot(t,mt,'Linewidth',1);     %绘图,线条宽度为1
xlabel('t/时间');             %必须放在plot后面
ylabel('调制信号m(t)');
title('调制信号时域波形');
axis([0,0.1,-1.1,1.1]);       %横纵坐标范围[xmin,xmax,ymin,ymax]

%% *****************调制信号的频域波形*****************
[f,mf] = T2F(t,mt);           %傅里叶变换,调用T2F函数,并返回f、mf的值
subplot(3,2,2);
plot(f,abs(mf),'r','Linewidth',1);
xlabel('f/Hz');
ylabel('幅度/m(f)');
title('调制信号的频谱');
axis([-150,150,-inf,inf]);    %调制信号是fm=100,所以观察范围要将其包含进去

%% *****************载波信号的时域波形*****************
fc = 1000;                    %载波信号频率
zaibo = cos(2*pi*fc*t);       %载波信号时域表达式
subplot(3,2,3);
plot(t,zaibo,'Linewidth',1);
xlabel('t/时间');
ylabel('载波信号');
axis([0,0.02,-1.1,1.1])

%% *****************载波信号的频域波形*****************
[f1,zaibof] = T2F(t,zaibo);
subplot(3,2,4);
plot(f1,zaibof,'r','Linewidth',1);
xlabel('f/Hz');
ylabel('幅度/zaibo(f)');
axis([-1200,1200,-inf,inf]);

%% *****************AM波信号的时域波形*****************
A0 = 1;                        %叠加的直流分量
sam = (A0+mt).*zaibo;
subplot(3,2,5);
plot(t,sam,'Linewidth',1);
hold on;
plot(t,A0+mt,'r','Linewidth',1);%画包络
xlabel('t/时间');
ylabel('AM调制信号幅度');
title('AM调制信号及其包络');
axis([0,0.02,-2.1,2.1]);

%% *****************AM波信号的频域波形*****************
[f2,samf] = T2F(t,sam);
subplot(3,2,6);
plot(f2,samf,'r','Linewidth',1);
xlabel('f/Hz');
ylabel('幅度/sam(f)');
axis([-1200,1200,-inf,inf]);

%% 相干解调
%% ****************已调信号与载波信号相乘****************
%信道传输中考虑噪声干扰
SNR = 20;                      %信噪比20dB
sam_noisy = awgn(sam,SNR,'measured');
st = sam_noisy.*cos(2*pi*fc*t);
figure();
subplot(2,1,1);
plot(t,st,'Linewidth',1);
xlabel('t/时间');
ylabel('幅度');
title('已调信号与载波信号相乘');
axis([0,0.02,-2.5,2.5]);

%% *************已调信号与载波信号相乘的频谱*************
[f,sf] = T2F(t,st);
subplot(2,1,2);
plot(f,sf,'r','Linewidth',1);
xlabel('f/Hz');
ylabel('幅度');
title('AM调制信号频谱');
axis([-2500,2500,-inf,inf]);

%% ********************解调出来的信号********************
yf = lpf(f,sf,2*fm);                %经低通滤波器,滤除高频载波
[t,st] = F2T(f,yf);                 %傅里叶逆变换
figure();
subplot(2,1,1);
plot(t,st*2-A0,'Linewidth',1);
xlabel('t/时间');
ylabel('幅度');
title('解调出来的信号');
axis([0,0.1,-1.1,1.1]);

%% ***********************原始信号***********************
subplot(2,1,2);
plot(t,mt,'g-','Linewidth',1);      % 绘制原始基带信号
title('原始基带信号');             
xlabel('t/时间');                  
ylabel('幅度');                     
axis([0 0.1 -1.1 1.1]);             

2.T2F.m文件,FFT功能

%傅里叶变换--FFT
function [f,mf] = T2F(t,mt)
T = t(end);                 %④输入信号的时间最大值
df = 1/T;                   %③频率分辨率,由定义式df=fs/N推导可得
N = length(t);              %②[0, Δt, 2Δt, ..., T-Δt],t的长度就是采样点数
f = -N/2*df:df:(N/2-1)*df;  %①频谱图的横坐标
mf = fft(mt);
mf = T/N*fftshift(mf);      %将0-fs频谱搬移到-fs/2-fs/2频谱,乘以T/N实现幅度归一化

3.F2T.m文件,IFFT功能

%傅里叶逆变换
function [t,st] = F2T(f,yf)
df = f(2)-f(1);             %频率间隔
fmax =( f(end)-f(1)+df);    %最大频率,+df是要把f(end)的值包含进去
dt = 1/fmax;                %时域的分辨率,可类比T2F中的频谱分辨率
N = length(f);              %采样点数
t = 0:dt:(N-1)*dt;
yf = fftshift(yf);          %将0-fs频谱搬到-fs/2-fs/2
st = fmax*ifft(yf);         %做IFFT
st = real(st);              %取实部

4.lpf.m文件,低通滤波功能

%低通滤波器
function yf = lpf(f,sf,B)
N = length(f);                      %采样点数
df = f(2)-f(1);                     %频率间隔
ym = zeros(1,N);                    %创建1×N的全零数组
xm = floor(B/df);                   %带宽/频率间隔,向下取整,计算需要的采样点数
xm_shift = [-xm:xm-1]+floor(N/2);   % 因为前面做FFT将0频率搬移到中心处,
                                    % 因此,低通低频频率相应地搬移fN/2,才是对应的频率点
ym(xm_shift) = 1;                   % 低通通过频率处幅度为1,其余为0,相当于理想低通
yf = ym.*sf;                        %信号经过理想低通滤波器

四、结果图

五、思考

1.采样点数 N=length(t)

在实际信号处理中,信号通常是连续的。为了在计算机中处理这种信号,我们需要将其离散化,这个过程称为采样。

假设有一个时间向量 t,表示信号的采样时间点。例如,如果 t 是从 0 秒开始,以 Δt 间隔(即采样周期)采样,直到 T 秒结束,那么 t 就是 [0, Δt, 2Δt, ..., T-Δt]。那么时间向量 t 的长度,也就是信号的采样点数。

2.频率分辨率&时域的分辨率

df = fs/N = fs/(T/dt) = fs/(T*fs) = 1/T 。类似的,dt = 1/fmax 。 

3.DFT与IDFT的幅度归一化

直接计算的 FFT 输出没有经过归一化,频谱的幅度通常会比时域信号的幅度大。为了确保频谱的幅度与实际信号幅度保持一致,引入归一化。具体来说,经过适当的归一化处理后,频域中的幅度能够真实地代表时域信号的能量或振幅分布,各个频率分量的幅度准确地反映了原始时域信号在这些频率上的贡献。

归一化因子(简化)归一化因子(精确)
DFT1/NT/N
IDFTNfmax(频谱带宽)

在 FFT 中的归一化,乘以T/N是为了调整由于求和过程导致的幅度膨胀。这是因为 FFT 的计算是对整个信号的加总。

在 IFFT 中的归一化,乘以 fmax 是为了补偿频谱宽度对时域信号的影响,确保信号幅度与原始信号一致。

 

这两种归一化的目的是相同的:确保信号在不同域之间转换时,幅度保持一致,但它们在计算方法上有所不同,因为它们适用于不同的转换过程(FFT 和 IFFT)。

4.fftshift()的理解

fft: 计算信号的傅里叶变换,频率分量从零到正再到负。

fftshift: 将 fft 的输出进行重新排列,调整频谱排列,将零频率分量移动到中心,使频谱更加直观对称。

 参考:通信原理与MATLAB(一):AM的调制解调_am调制原理-CSDN博客文章浏览阅读2.6w次,点赞61次,收藏336次。通信原理和MATLAB_am调制原理https://blog.csdn.net/qq_47598782/article/details/128300971

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值