数字信号载波传输FSK
1 FSK调制
2 FSK解调
3 载波FSK信号的仿真
MATLAB程序
仿真载波4-FSK信号
clc;
clear;
close all;
symbol = 10; % 发送符号数
M = 4; % 4-FSK
T = 1; % 符号周期/s
delta = 1/T; % FSK的频率间隔
fs = 100; % 采样频率/Hz
ts = 1/fs; % 采样时间间隔
t = 0:ts:T-ts; % 一个符号周期的时间矢量
fc = 10; % 载波频率/Hz
c0 = sqrt(2/T)*exp(1j*2*pi*(fc + delta * 0)*t);% 载波信号0
c1 = sqrt(2/T)*exp(1j*2*pi*(fc + delta * 1)*t);% 载波信号1
c2 = sqrt(2/T)*exp(1j*2*pi*(fc + delta * 2)*t);% 载波信号2
c3 = sqrt(2/T)*exp(1j*2*pi*(fc + delta * 3)*t);% 载波信号3
% 绘制载波波形
figure;
subplot(4,1,1);plot(t,real(c0));legend('f = 10Hz');axis([-inf inf -5 5]);
subplot(4,1,2);plot(t,real(c1));legend('f = 11Hz');axis([-inf inf -5 5]);
subplot(4,1,3);plot(t,real(c2));legend('f = 12Hz');axis([-inf inf -5 5]);
subplot(4,1,4);plot(t,real(c3));legend('f = 13Hz');axis([-inf inf -5 5]);
msg = randi([0 3],1,symbol); % 消息比特(随机)
% 4-FSK载波调制
tx = zeros(1,length(msg)*length(t));
for k = 1:length(msg)
for p = 1:length(t)
if(msg(k) == 0)
tx((k-1)*length(t)+p) = real(c0(p));
elseif(msg(k) == 1)
tx((k-1)*length(t)+p) = real(c1(p));
elseif(msg(k) == 2)
tx((k-1)*length(t)+p) = real(c2(p));
elseif(msg(k) == 3)
tx((k-1)*length(t)+p) = real(c3(p));
else
tx((k-1)*length(t)+p) = 0;
end
end
end
figure;
subplot(2,1,1);plot(tx);axis([-inf inf -5 5]);title('4-FSK 发送信号');
disp(['发送数据: ' num2str(msg)]);
% 信道传输
EsN0 = 20; % 信噪比,Es/N0
snr1 = 10.^(EsN0/10); % 信噪比转换为线性值
slow = norm(tx).^2/symbol; % 求每个符号的平均功率
sigma = sqrt(slow/(2*EsN0)); % 根据符号功率求噪声功率
rx = tx + sigma*rand(1,length(tx)); % 加入AWGN
subplot(2,1,2);plot(rx);axis([-inf inf -5 5]);title('4-FSK 接收信号');
rx1 = reshape(rx,length(t),length(msg)); % 把数据变为一个符号是一列的格式
r0 = (c0 * rx1)/length(t); % 非相干解调,相关器输出,分别求与四种信号的互相关
r1 = (c1 * rx1)/length(t);
r2 = (c2 * rx1)/length(t);
r3 = (c3 * rx1)/length(t);
% 判决:欧氏距离最接近
msg_demodulation = zeros(1,symbol);
for k = 1:symbol
Dis = zeros(1,M);
Dis(1) = abs(r0(k));
Dis(2) = abs(r1(k));
Dis(3) = abs(r2(k));
Dis(4) = abs(r3(k));
[x,y] = max(Dis);% 求最大值
msg_demodulation(k) = y-1;
end
disp(['收到数据: ' num2str(msg_demodulation)]);
bit_error_cnt = 0;
for k = 1:symbol
if(msg_demodulation(k) ~= msg(k))
% 当判定的接收比特与发送比特不一致时,认为判定错误
bit_error_cnt = bit_error_cnt + 1;
end
end
bit_error_percent = bit_error_cnt/symbol;
disp(['误码率: ' num2str(bit_error_percent)]);
结果: