模拟信号调制解调
本文以DSB调制为主,因为AM、SSB调制都与DSB调制有关。GUI界面代码就不贴了,有很多博主已经写了GUI界面怎么制作文章,动动手指就可以找到。
以下代码已全部运行,确保没有错误,不误导各位,同时欢迎大家一起讨论。
GUI界面如下:
DSB调制信号Callback回调函数MATLAB程序如下:
function DSB_Modulation_Callback(~, ~, handles)
axes(handles.axes4)
global fc;%载波信号的频率
global fm;%调制信号的频率
global Am;%调制信号的幅值
global DSB_Modulation_Num;%DSB调制的采样值
N = 1000;%采样点
f = 100; %初始化采样频率
%%根据载波频率的不同,调整采样频率
if fc > 1000
f = 200000;
else if (500 < fc) && (fc <= 1000)
f = 100000;
else if (100 < fc) && (fc <= 500)
f = 10000;
else
f = 1000;
end
end
end
n = 0:N-1;
t = n/f; %采样时间间隔
mt = Am * cos(2*pi*fm*t);%调制信号的表达式
DSB_Modulation_Num = mt.*cos(2*pi*fc*t);%DSB调制的采样值
plot(t,DSB_Modulation_Num);%画出DSB调整时域波形图
hold on
plot(t,mt,'r--');%画出包络波形
plot(t,-mt,'r--');%画出包络波形
hold off
axis([0,N/f,-Am,+Am])%设置坐标轴范围
axes(handles.axes5)
DSB_Modulation_fft = fft(DSB_Modulation_Num,N);%傅里叶变换
DSB_Modulation_P = abs(DSB_Modulation_fft).^2/N;%用周期法求频谱
New_X = n*f/N;%计算傅里叶变换的坐标
%%将频谱进行搬移,使其分布在坐标轴两侧
temp(1,N/2) = 0;
for i = 1:N/2
temp(i) = New_X(i);
New_X(i) = New_X(i+N/2);
New_X(i+N/2) = temp(i);
end
for i = 1:N
New_X(i) = New_X(i)-f/2;
end
plot(New_X,DSB_Modulation_P);%画出频谱波形图
axis([-5*fc,5*fc,0,max(abs(DSB_Modulation_fft))])%设置坐标轴范围
DSB解调信号Callback回调函数MATLAB程序如下:
function DSB_Demodulation_Callback(~, ~, handles)
axes(handles.axes4)
global fc;%载波信号的频率
global fm;%调制信号的频率
global Am;%调制信号的幅值
global DSB_Modulation_Num;%DSB调制的采样值
global Modulation_Num;%调制信号的采样值
global t_Modulation;%调制信号的采样点时刻
N = 1000;%采样点
f = 100; %初始化采样频率
%%根据载波频率的不同,调整采样频率
if fc > 1000
f = 200000;
else if (500 < fc) && (fc <= 1000)
f = 100000;
else if (100 < fc) && (fc <= 500)
f = 10000;
else
f = 1000;
end
end
end
n = 0:N-1;
t = n/f; %采样时间间隔
wp = 2*(0.5*fm-300)/f;%通带频率
ws = 2*(0.5*fm+300)/f;%阻带频率
wdel = ws-wp;%带宽
wn = 0.5*(wp+ws);%截止频率
D = ceil(6.6*pi/wdel);%计算滤波器阶数
window = hamming(D+1);
%相干解调之后的数值
DSB_Demodulation_Num = DSB_Modulation_Num .* cos(2*pi*fc*t_Modulation);
LPF = fir1(D,wn,window);%用hamming窗法生成低通滤波器(LPF)
DSB_Demodulation_LPF = filter(LPF,1,DSB_Demodulation_Num);%通过滤波器
DSB_Demodulation_Temp = 2*DSB_Demodulation_LPF;%恢复调制信号的幅值
T(1,:) = t(1,10:length(t));
DSB_Demodulation_Out(1,:) = DSB_Demodulation_Temp(1,10:length(DSB_Demodulation_Temp));
plot(T,DSB_Demodulation_Out,'g')%画出相干解调后的调制信号输出波形
hold on
plot(t_Modulation,Modulation_Num,'color','r')
hold off
axis([0,N/f,-Am,Am])%设置坐标轴的范围
axes(handles.axes5)
DSB_Demodulation_fft = fft(DSB_Demodulation_Temp);%傅里叶变换
DSB_Demodulation_P = abs(DSB_Demodulation_fft).^2/N;%用周期法求频谱
New_X = n*f/N;%计算傅里叶变换的坐标
%%将频谱进行搬移,使其分布在坐标轴两侧
temp(1,N/2) = 0;
for i = 1:N/2
temp(i) = New_X(i);
New_X(i) = New_X(i+N/2);
New_X(i+N/2) = temp(i);
end
for i = 1:N
New_X(i) = New_X(i)-f/2;
end
plot(New_X,DSB_Demodulation_P);%画出频谱波形
axis([-10*fm,10*fm,0,max(abs(DSB_Demodulation_fft))])%设置坐标轴范围
模拟信号调制与解调的原理还是相对简单的,对于有编程能力的,如果不限时间,应该是可以完成的
测试输入数据为:载波信号频率为100Hz、载波信号直流分量为4A、调制信号频率为10Hz、调制信号直流分量为2A。
献上效果图。
调制信号
载波信号
DSB调制信号
DSB解调信号
由图分析得,调制时,AM调制信号幅值为6,DSB调制信号幅值为2,SSB调制信号幅值为1;解调时采用相干解调法,AM解调信号、DSB解调信号、SSB解调信号输出均为调制信号,信号幅值为2,解调信号有微小延时。