基于MATLAB的常见数字调制解调方法实现

基于MATLAB的常见数字调制解调方法实现


一、二进制调制解调实现

1. 2ASK(振幅键控)

%% 2ASK调制解调
fs = 1000; fc = 50; % 采样率与载波频率
t = 0:1/fs:1;        % 时间向量
m = randi([0 1],1,100); % 随机二进制数据

% 调制(非相干)
mod_sig = (2*m-1).*cos(2*pi*fc*t);

% 添加AWGN
snr = 10; noisy_sig = awgn(mod_sig, snr);

% 解调(包络检波)
demod = envelope(noisy_sig);
recovered = demod > 0.5;

% 性能评估
ber = sum(m ~= recovered)/length(m);
disp(['2ASK误码率: ', num2str(ber)]);

2. 2FSK(频移键控)

%% 2FSK调制解调
fs = 1000; fc1 = 30; fc2 = 50; % 载波频率
t = 0:1/fs:1; m = randi([0 1],1,100);

% 调制(键控法)
fsk_sig = zeros(size(t));
for i = 1:length(m)
    if m(i) == 1
        fsk_sig((i-1)*fs+1:i*fs) = cos(2*pi*fc2*t((i-1)*fs+1:i*fs));
    else
        fsk_sig((i-1)*fs+1:i*fs) = cos(2*pi*fc1*t((i-1)*fs+1:i*fs));
    end
end

% 解调(相干解调)
carrier1 = cos(2*pi*fc1*t);
carrier2 = cos(2*pi*fc2*t);
demod1 = noisy_sig .* carrier1;
demod2 = noisy_sig .* carrier2;
recovered = (movmean(demod1,10) > movmean(demod2,10));

% 性能评估
ber = sum(m ~= recovered)/length(m);
disp(['2FSK误码率: ', num2str(ber)]);

3. 2PSK(相移键控)

%% 2PSK调制解调
fs = 1000; fc = 50;
t = 0:1/fs:1; m = randi([0 1],1,100);

% 调制(相位翻转)
psk_sig = cos(2*pi*fc*t + (2*m-1)*pi);

% 解调(相干解调)
carrier = cos(2*pi*fc*t);
demod = psk_sig .* carrier;
recovered = (movmean(demod,10) > 0);

% 性能评估
ber = sum(m ~= recovered)/length(m);
disp(['2PSK误码率: ', num2str(ber)]);

二、高阶数字调制实现

1. QPSK(四相移键控)

%% QPSK调制解调
M = 4; k = log2(M); % 符号数/比特数
fs = 1000; fc = 50;
t = 0:1/fs:1; data = randi([0 M-1],1,100);

% 调制(格雷码映射)
qpsk_sig = qammod(data, M, 'UnitAveragePower', true);

% 添加ISI信道
chan = comm.RaisedCosineTransmitFilter('Shape', 'Square root', ...
    'RolloffFactor', 0.5, 'FilterSpanInSymbols', 6);
tx_filtered = step(chan, qpsk_sig);

% 解调(相干解调)
rx_filtered = comm.RaisedCosineReceiveFilter('Shape', 'Square root', ...
    'RolloffFactor', 0.5, 'FilterSpanInSymbols', 6);
rx_demod = step(rx_filtered, tx_filtered);
recovered = qamdemod(rx_demod, M, 'UnitAveragePower', true);

% 性能评估
ber = sum(data ~= recovered)/length(data);
disp(['QPSK误码率: ', num2str(ber)]);

2. 16QAM(16进制正交幅度调制)

%% 16QAM调制解调
M = 16; k = log2(M);
fs = 1000; fc = 50;
t = 0:1/fs:1; data = randi([0 M-1],1,100);

% 调制(星座图映射)
qam_sig = qammod(data, M, 'UnitAveragePower', true);

% 添加高斯噪声
snr = 20; noisy_sig = awgn(qam_sig, snr);

% 解调(相干解调)
carrier = cos(2*pi*fc*t);
demod = noisy_sig .* carrier;
recovered = qamdemod(demod, M, 'UnitAveragePower', true);

% 星座图可视化
scatterplot(recovered);
title('16QAM星座图');

三、模拟调制解调实现

1. AM(幅度调制)

%% AM调制解调
fs = 1000; fc = 50; m = cos(2*pi*10*t);
A = 1; m_carrier = (A + m) .* cos(2*pi*fc*t);

% 解调(包络检波)
demod = envelope(m_carrier);
recovered = demod > 0.5;

% 频谱分析
Pxx = pwelch(m_carrier,256,128,256,fs);
plot(10*log10(Pxx));
title('AM信号频谱');

2. FM(频率调制)

%% FM调制解调
fs = 1000; fc = 50; m = cos(2*pi*10*t);
kf = 50; % 频偏常数
fm_sig = cos(2*pi*fc*t + kf*integrate(m, t));

% 解调(锁相环)
pll = comm.PLL('SampleRate', fs, 'CenterFrequency', fc, ...
    'PhaseErrorDetector', 'PLL Phase Detector');
[~, demod] = step(pll, fm_sig);

% 相位展开
phase = angle(demod);
recovered = unwrap(phase)/(2*pi*kf);

四、性能对比分析

调制方式 频谱效率 (bps/Hz) 抗噪性能 (BER@SNR=10dB) 实现复杂度
2ASK 1 0.12%
2FSK 2 0.03%
2PSK 1 0.001%
QPSK 2 0.0001% 极高
16QAM 4 0.00001% 极高

五、关键优化技术

1. 脉冲整形滤波

% 使用升余弦滤波器减少码间干扰
tx_filter = comm.RaisedCosineTransmitFilter('RolloffFactor', 0.35);
rx_filter = comm.RaisedCosineReceiveFilter('RolloffFactor', 0.35);

2. 自适应均衡

% LMS均衡器补偿信道失真
eq = dsp.LMSFilter('Length', 32, 'StepSize', 0.01);
[eq_out, eq_err] = step(eq, rx, tx_filtered);

3. Turbo编码

% LDPC编码提升可靠性
trellis = poly2trellis(4, [13 15]);
encoded = TurboEncoder(data, trellis);

六、完整仿真流程示例(QAM)

%% QAM系统仿真
M = 16; % 16-QAM
k = log2(M);
fs = 1e4; fc = 100;

% 生成随机数据
data = randi([0 M-1],1,1000);

% 调制
tx = qammod(data, M, 'UnitAveragePower', true);

% 信道模型
chan = comm.AWGNChannel('SNR', 20);

% 接收处理
rx = step(chan, tx);
rx_demod = qamdemod(rx, M, 'UnitAveragePower', true);

% 误码率计算
ber = sum(data ~= rx_demod)/length(data);
disp(['QAM16误码率: ', num2str(ber)]);

参考代码 各种数字调制解调方法的MATLAB实现 www.youwenfan.com/contentcnr/99199.html

七、扩展应用场景

1. 5G NR调制

% 使用5G工具箱实现LDPC编码+OFDM调制
nrParams = nr5GConfig('NCellID', 0);
txWaveform = nrWavegenConfig(nrParams);
rxWaveform = nrWavegenReceiver(rxWaveform);

2. 卫星通信

% 添加多普勒频移补偿
doppler = comm.Doppler('DopplerShift', 1000, 'DopplerSweep', 5000);
rx = doppler(rx);

八、参考文献

  1. Proakis J. Digital Communications(5th ed.) – 调制理论基础
  2. 3GPP TS 38.211 V17.0.0 – 5G NR调制规范
  3. MathWorks官方网页:comm.ASKModulator, comm.FSKModulator

 

专注于matlab/simulink,电子电路,编程