2fsk调制和解调matlab代码仿真
时间: 2023-09-26 13:09:05 浏览: 109
以下是2FSK调制和解调的MATLAB代码示例:
调制:
```matlab
clear all;
close all;
clc;
% 定义参数
fc1 = 500; % 第一个载波频率
fc2 = 1500; % 第二个载波频率
fs = 8000; % 采样频率
T = 1/fs; % 采样时间
t = 0:T:1-T; % 时间序列
fdev = 100; % 频偏
A = 1; % 振幅
% 输入二进制信号
M = 10; % 信息位数
data = randi([0 1],1,M); % 随机生成信息序列
% 2FSK调制
f = zeros(1,length(t)); % 频率序列
for i = 1:M
if data(i) == 0
f = f + (fc1 + fdev*sin(2*pi*(fc2-fc1)/T*t))*T; % 发送频率为fc1+fdev
else
f = f + (fc2 + fdev*sin(2*pi*(fc2-fc1)/T*t))*T; % 发送频率为fc2+fdev
end
end
% 显示发送信号
plot(t,f)
xlabel('时间(s)')
ylabel('信号幅度')
title('2FSK调制信号波形')
% 音频播放
sound(A*sin(2*pi*f),fs);
```
解调:
```matlab
clear all;
close all;
clc;
% 定义参数
fc1 = 500; % 第一个载波频率
fc2 = 1500; % 第二个载波频率
fs = 8000; % 采样频率
T = 1/fs; % 采样时间
t = 0:T:1-T; % 时间序列
fdev = 100; % 频偏
A = 1; % 振幅
W = 2*pi*fdev/(fc2-fc1); % 调制指数
N = length(t); % 采样点数
% 2FSK调制
M = 10; % 信息位数
data = randi([0 1],1,M); % 随机生成信息序列
f = zeros(1,length(t)); % 频率序列
for i = 1:M
if data(i) == 0
f = f + (fc1 + fdev*sin(2*pi*(fc2-fc1)/T*t))*T; % 发送频率为fc1+fdev
else
f = f + (fc2 + fdev*sin(2*pi*(fc2-fc1)/T*t))*T; % 发送频率为fc2+fdev
end
end
% 接收信号
y = A*sin(2*pi*f); % 接收到的信号
sound(y,fs); % 播放接收到的声音
% 2FSK解调
data_hat = zeros(1,M); % 估计的信息序列
for i = 1:M
% 解调第i个符号
yt = y((i-1)*N/M+1:i*N/M); % 获取第i个符号的采样点
f1 = fc1 + fdev*sin(2*pi*(fc2-fc1)/T*t((i-1)*N/M+1:i*N/M)); % 发送频率为fc1+fdev
f2 = fc2 + fdev*sin(2*pi*(fc2-fc1)/T*t((i-1)*N/M+1:i*N/M)); % 发送频率为fc2+fdev
D1 = sum(yt.*sin(2*pi*f1*T)); % 计算接收信号在fc1上的投影
D2 = sum(yt.*sin(2*pi*f2*T)); % 计算接收信号在fc2上的投影
if D1 > D2
data_hat(i) = 0;
else
data_hat(i) = 1;
end
end
% 显示估计的信息序列
disp('发送的信息序列:');
disp(data);
disp('估计的信息序列:');
disp(data_hat);
```
在运行以上代码时,请确保已经安装了MATLAB并正确配置了音频设备。
阅读全文