余弦波产生程序
function signal = cosx(A, fc, t1, t2, fs)
t = t1 : 1/fs : t2;
signal = A * cos(2 * pi * fc * t);
end
FM
FM信号产生
FM信号形式
只需要对调制信号进行积分,然后放在载波的附加相位项即可。
积分程序
由积分的定义可得
function signal = integral(x, fs)
N = length(x);
signal = zeros(1, N);
for i = 1 : N
signal(i) = sum(x(1 : i)) / fs;
end
end
1/fs,为采样间隔,也就是每个小矩形的宽,sum(x(1 : i))将1到第i个采样点的值相加,采样值对应小矩形的高,fs越大,积分结果越接近实际值。
实验主程序
clc;clear;
%% 参数定义
fs = 1000;
t = 0 : 1/fs : 3;
fc = 20;
fm = 1;
kf = 5;
kp = 5;
%% 调制信号与载波信号定义
mt = cos(2 * pi * fm * t);
ct = cos(2 * pi * fc * t);
%% 调频产生
mt1 = integral(mt, fs);
st = cos(2 * pi * fc * t + kp * mt1);
%% 调相
% st = cos(2 * pi * fc * t + kp * mt);
%% 调频解调
demt = fmde(st);
%% 调相解调
% demt = pmde(st, fc, t);
%% 频谱分析
Hmt = fft(mt); Hct = fft(ct); Hst = fft(st); Hdemt = fft(demt);
NF = length(Hmt);
nf = 0 : 1 / NF : 1 - 1 / NF;
f = nf * fs;
%% 画图
figure(1);
subplot(2, 3, 1);plot(t, mt);title('调制信号时域波形');
subplot(2, 3, 2);plot(t, ct);title('载波信号时域波形');
subplot(2, 3, 3);plot(t, st);title('已调信号时域波形');
subplot(2, 3, 4);plot(f, abs(Hmt));title('调制信号频谱');
subplot(2, 3, 5);plot(f, abs(Hct));title('载波信号频谱');
subplot(2, 3, 6);plot(f, abs(Hst));title('已调信号频谱');
% figure(2);
% subplot(2, 1, 1);plot(t, demt);title('解调信号时域波形');
% subplot(2, 1, 2);plot(f, abs(Hdemt));title('解调信号频谱');
实验结果
FM信号解调
解调原理
可以先对接收到的FM信号进行微分,得到FM-AM信号,然后对FM-AM信号求得它对应的解析信号,解析信号为复信号,解析信号的模就是原FM-AM信号的振幅的绝对值,具体表达式为
|2*pi*f + kf * mt|,如果想通过获得解析信号的模进行解调那么2*pi*f + kf * mt要恒大于0,否则小于0的部分会被翻上取,导致解调后的波形相对于原调制信号有剧烈的失真,如果2*pi*f + kf * mt恒大于0,那么解析信号的相当于就是先对调制信号进行一个幅值等比例变换再加上一个正值,mt原所在频段内没有产生失真。
微分程序
function signal = differ(x)
N = length(x);
signal = zeros(1, N);
for i = 1 : N - 1
signal(i) = x(i + 1) - x(i);
end
end
FM解调程序
function signal = fmde(x)
diffx = differ(x);
hilbertx = hilbert(diffx);
signal = abs(hilbertx);
end
实验主程序
clc;clear;
%% 参数定义
fs = 1000;
t = 0 : 1/fs : 3;
fc = 20;
fm = 1;
kf = 5;
kp = 5;
%% 调制信号与载波信号定义
mt = cos(2 * pi * fm * t);
ct = cos(2 * pi * fc * t);
%% 调频产生
mt1 = integral(mt, fs);
st = cos(2 * pi * fc * t + kp * mt1);
%% 调相
% st = cos(2 * pi * fc * t + kp * mt);
%% 调频解调
demt = fmde(st);
%% 调相解调
% demt = pmde(st, fc, t);
%% 频谱分析
Hmt = fft(mt); Hct = fft(ct); Hst = fft(st); Hdemt = fft(demt);
NF = length(Hmt);
nf = 0 : 1 / NF : 1 - 1 / NF;
f = nf * fs;
%% 画图
figure(1);
subplot(2, 3, 1);plot(t, mt);title('调制信号时域波形');
subplot(2, 3, 2);plot(t, ct);title('载波信号时域波形');
subplot(2, 3, 3);plot(t, st);title('已调信号时域波形');
subplot(2, 3, 4);plot(f, abs(Hmt));title('调制信号频谱');
subplot(2, 3, 5);plot(f, abs(Hct));title('载波信号频谱');
subplot(2, 3, 6);plot(f, abs(Hst));title('已调信号频谱');
figure(2);
subplot(2, 1, 1);plot(t, demt);title('解调信号时域波形');
subplot(2, 1, 2);plot(f, abs(Hdemt));title('解调信号频谱');
实验结果
PM
PM信号产生
直接将调制信号放在载波的附加相位项即可。
实验主程序
clc;clear;
%% 参数定义
fs = 1000;
t = 0 : 1/fs : 3;
fc = 20;
fm = 1;
kf = 5;
kp = 5;
%% 调制信号与载波信号定义
mt = cos(2 * pi * fm * t);
ct = cos(2 * pi * fc * t);
%% 调频产生
% mt1 = integral(mt, fs); %
% st = cos(2 * pi * fc * t + kp * mt1);
%% 调相
st = cos(2 * pi * fc * t + kp * mt);
%% 调频解调
% demt = fmde(st);
%% 调相解调
demt = pmde(st, fc, t);
%% 频谱分析
Hmt = fft(mt); Hct = fft(ct); Hst = fft(st); Hdemt = fft(demt);
NF = length(Hmt);
nf = 0 : 1 / NF : 1 - 1 / NF;
f = nf * fs;
%% 画图
figure(1);
subplot(2, 3, 1);plot(t, mt);title('调制信号时域波形');
subplot(2, 3, 2);plot(t, ct);title('载波信号时域波形');
subplot(2, 3, 3);plot(t, st);title('已调信号时域波形');
subplot(2, 3, 4);plot(f, abs(Hmt));title('调制信号频谱');
subplot(2, 3, 5);plot(f, abs(Hct));title('载波信号频谱');
subplot(2, 3, 6);plot(f, abs(Hst));title('已调信号频谱');
% figure(2);
% subplot(2, 1, 1);plot(t, demt);title('解调信号时域波形');
% subplot(2, 1, 2);plot(f, abs(Hdemt));title('解调信号频谱');
实验结果
2*pi*f + kf * mt恒大于0时。
2*pi*f + kf * mt有部分小于0时。
可以明显看到,当mf过大,那么2*pi*f + kf * mt就有一部分小于0,导致解调信号的失真。
PM信号解调
解调原理
类似于FM解调,可以利用正弦解析信号的相位为正弦信号的相位进行解调。
具体步骤,将接收到的PM信号进行希尔伯特变换y,原PM信号作为实部,y作为虚部构成PM信号的解析信号,直接利用求复数相位的数学表达式即可获得解析信号的相位,也就是PM信号的相位,具体表达式为 2 * pi * fc * t + kp * mt,所以还需要减去2 * pi * fc * t,并且在计算机中表示相位只能表示一个主值区间,需要对利用计算机求得复数的相位进行解卷,得到去相位卷绕的相位,即解调出来的信号。
解调程序
function signal = pmde(x, fc, t)
hilbertx = hilbert(x);
signal = unwrap(angle(hilbertx) - 2 * pi * fc * t);
end
unwrap()即为去相位卷绕。
实验主程序
clc;clear;
%% 参数定义
fs = 1000;
t = 0 : 1/fs : 3;
fc = 20;
fm = 1;
kf = 5;
kp = 5;
%% 调制信号与载波信号定义
mt = cos(2 * pi * fm * t);
ct = cos(2 * pi * fc * t);
%% 调频产生
% mt1 = integral(mt, fs); %
% st = cos(2 * pi * fc * t + kp * mt1);
%% 调相
st = cos(2 * pi * fc * t + kp * mt);
%% 调频解调
% demt = fmde(st);
%% 调相解调
demt = pmde(st, fc, t);
%% 频谱分析
Hmt = fft(mt); Hct = fft(ct); Hst = fft(st); Hdemt = fft(demt);
NF = length(Hmt);
nf = 0 : 1 / NF : 1 - 1 / NF;
f = nf * fs;
%% 画图
figure(1);
subplot(2, 3, 1);plot(t, mt);title('调制信号时域波形');
subplot(2, 3, 2);plot(t, ct);title('载波信号时域波形');
subplot(2, 3, 3);plot(t, st);title('已调信号时域波形');
subplot(2, 3, 4);plot(f, abs(Hmt));title('调制信号频谱');
subplot(2, 3, 5);plot(f, abs(Hct));title('载波信号频谱');
subplot(2, 3, 6);plot(f, abs(Hst));title('已调信号频谱');
figure(2);
subplot(2, 1, 1);plot(t, demt);title('解调信号时域波形');
subplot(2, 1, 2);plot(f, abs(Hdemt));title('解调信号频谱');
实验结果
理论来说应该不会有直流成分,因为计算机的有限字长,导致计算误差,但解调出来的信号并无失真。