msk调制解调matlab代码
时间: 2023-11-02 13:07:04 浏览: 118
以下是一个简单的 MSK 调制解调的 MATLAB 代码示例:
%% MSK 调制解调示例
close all; clear all; clc;
%% 参数设置
fc = 500; % 载波频率
fs = 10000; % 采样率
Tb = 0.1; % 位周期
N = 1000; % 信号长度
A = 1; % 幅度
fdev = 250; % 频偏
h = Tb/2; % MSK 的带宽
%% 生成二进制数据
data = randi([0 1],1,N);
%% MSK 调制
s = zeros(1,N*fs*Tb);
phi = 0;
for n = 1:N
if data(n) == 0
phi = phi + pi/2;
else
phi = phi - pi/2;
end
t = (n-1)*fs*Tb+1:n*fs*Tb;
s(t) = A*cos(2*pi*fc*t/fs+phi);
end
%% 加上频偏
t = 1:length(s);
s = s.*cos(2*pi*fdev*t/fs);
%% MSK 解调
data_hat = zeros(1,N);
for n = 1:N
t = (n-1)*fs*Tb+1:n*fs*Tb;
y = s(t).*cos(2*pi*fc*t/fs);
y_filt = filtfilt(h*[1 0 1], [1 -(2-h) 1 0], y);
if y_filt(end) > 0
data_hat(n) = 0;
else
data_hat(n) = 1;
end
end
%% BER 计算
ber = sum(data~=data_hat)/N;
%% 画图
subplot(2,1,1);
plot(s);
title('MSK 调制信号');
xlabel('采样点');
ylabel('幅度');
subplot(2,1,2);
plot(data,'b-');
hold on;
plot(data_hat,'r--');
title(['MSK 解调结果,BER = ' num2str(ber)]);
xlabel('位序号');
ylabel('比特值');
legend('原始数据','解调数据');
阅读全文