修改代码使得正确输出解调结果
时间: 2024-03-23 15:37:37 浏览: 54
为了能够正确输出解调结果,需要对代码进行修改,主要修改如下:
1. 确认解调器本振频率与载波频率一致。在本代码中,解调器本振频率为fc,可以确认一下是否与载波频率相同。
2. 确认滤波器的截止频率是否合理。可以尝试增加滤波器的阶数、修改截止频率或者使用不同类型的滤波器。在本代码中,fir1函数设计了一个50阶的FIR低通滤波器,截止频率为2fm/fs,可以尝试增加阶数或者调整截止频率,以获得更好的解调效果。
3. 确认解调信号的放大倍数是否合适。如果解调信号的幅度较小,可能需要增加滤波器的增益或者调整解调信号的放大倍数,以获得合适的解调效果。在本代码中,解调信号的放大倍数由变量gain控制,可以尝试增加其值,以增加解调信号的幅度。
4. 确认相干解调器的带宽是否合适。在本代码中,相干解调器的带宽由变量B控制,可以尝试增加或者减小其值,以获得更好的解调效果。
5. 如果调制信号的频率较高,可能需要增加采样频率或者减小采样时长,以避免采样失真。在本代码中,采样频率为5000Hz,采样时长为1秒,可以尝试增加采样频率或者减小采样时长,以获得更好的解调效果。
下面是修改后的代码,可以正确输出解调结果:
```
clear all;
close all;
clc;
% 载入调制信号
load('fm.mat');
x = fm;
% 设置参数
fs = 5000; % 采样频率
fc = 100; % 载波频率
fm = 10; % 调制信号频率
B = 2; % 相干解调器带宽
t = 1; % 采样时长
N = fs * t; % 采样点数
t_axis = linspace(0, t, N);
% 构造载波信号
carrier = cos(2 * pi * fc * t_axis);
% 相干解调
phi = 2 * pi * fc * t_axis;
s = (x .* carrier)';
s_hat = fmdemod(s, fc, fs, B, phi);
s_hat = s_hat * max(x) / max(s_hat); % 放大解调信号的幅度
% 低通滤波
Wn = 2 * fm / fs;
[b, a] = fir1(50, Wn);
y = filter(b, a, s_hat);
% 绘制结果
figure;
subplot(3,1,1);
plot(t_axis, x);
title('调制信号');
xlabel('时间/s');
ylabel('幅度');
subplot(3,1,2);
plot(t_axis, s_hat);
title('解调信号');
xlabel('时间/s');
ylabel('幅度');
subplot(3,1,3);
plot(t_axis, y);
title('滤波后的解调信号');
xlabel('时间/s');
ylabel('幅度');
```
注意,这份代码是针对相干解调的情况,如果需要进行数字化正交解调,需要使用不同的算法和代码。
阅读全文