一个简单的单边带电台仿真
这个仿真以真实的音频信号作为输入,设计一个单边带发信机。将基带信号调制为SSB信号后送入带通型高斯噪声信道,加入给定功率的噪声之后,再送入单边带接收机。单边带接收机将型号解调下来,通过计算机声卡将解调信号播放出来试听效果,从而对信道信噪比与解调音质之间的关系进行主观测试。
现设计一个单边带发信机、带通信道和相应的接收机,参数定位如下值。
(1) 输入信号为一个话音信号,采样率为 8000Hz。话音输入后首先进行预滤波,滤波
器是一个频率范围在[300, 3400]Hz的带通滤波器,其目的是将话音频频谱限制在3400Hz以下。单边带调制的载波频率设计为 10kHz,调制输出上边带。要求观测单边带调制前后的信号功率谱。 (2) 信道是一个带限高斯噪声信道,其通带频率范围是[10000, 13500]Hz。能够根据信噪
比 SNR 的要求加入高斯噪声。 (3) 接收机采用相干解调方式。为了模拟载波频率误差对解调话音音质的影响,设本地
载波频率为 9.8kHz,与发信机载波平率相差200Hz。解调滤波器设计为 300~3400Hz的带通滤波器。 1. 对音频输入与调制的仿真
根据设置的参数,系统中信号最高频率约为 14kHz。为了较好地显示调制波形,系统仿真采样率设为 50kHz,满足取样定理。由于话音信号的采样率为 8000Hz,与系统仿真采样率不等,因此,在进行信号处理之前,必须将话音的采样率提高到 50kHz,用插值函数来做这一任务。
先编写程序将基带音频信号读入,进行[300,3400]Hz的带通滤波,并将信号采样率提高到 50kHz,进行单边带调制之后,将调制输出结果保存为 wav 文件,文件名为 SSB_OUT.wav。程序如下:
ForSSB.m
% FileName: ForSSB.m % 功能:音频录入与调制 clc; clear all;
% 录音,采样点数为 1000,采样率为 8000 % jilu = wavrecord(5*8000, 8000, 'double'); % wavwrite(jilu, 'GDGvoice8000.wav'); [wav, fs] = wavread('GDGvoice8000.wav');
% 计算声音的时间长度 t_end = 1/fs * length(wav); % 仿真系统采样率 Fs = 50000;
% 仿真系统采样时间点 t = 1/Fs:1/Fs:t_end;
% 设计 300~3400Hz 的带通滤波器 H(z) [fenzi, fenmu] = butter(3, [300 3400]/(fs/2));
% 对音频信号进行滤波 wav = filter(fenzi, fenmu, wav);
SSB_OUT = wav.*cos(2*pi*fc*t) -
wav_hilbert.*sin(2*pi*fc*t);
figure(1);
% 利用插值函数将音频信号的采样率提升为 Fs=50kHz
wav = interp1([1/fs:1/fs:t_end], wav, t, 'spline');
subplot(2, 2, 2); psd(wav, 10000, Fs); axis([0
% 音频信号的希尔伯特变换 wav_hilbert = imag(hilbert(wav)); % 载波频率 fc = 10000; % 单边带调制
2500 -20 10]);
subplot(2, 2, 3); plot(SSB_OUT(53550:53750)); axis([0 200 -0.3 0.3]);
subplot(2, 2, 4); psd(SSB_OUT, 10000, Fs); % 将 SSB 调制输出存盘备用 wavwrite(0.5*SSB_OUT, 'SSB_OUT.wav'); subplot(2, 2, 1); plot(wav(53550:53750)); axis([0 200 -0.3 0.3]);
程序仿真结果:
2. 对指定信噪比信道的仿真
仿真指定信噪比信道,仿真函数如下(ChanelSimulink.m)。
% FileName: ForSNR.m % 功能:计算实际信噪比 clear;
[in, Fs] = wavread('SSB_OUT.wav');
SNRdB = 20;
out = ChanelSimulink(in, SNRdB); wavwrite(out, Fs, 'Chanel_OUT.wav');
计算信噪比为20db 时的信道输出,将结果保存为 Chanel_out.wav 文件。输出仿真的实际测量信噪比为 17.8303 db。
% ChanelSimulink.m
% 功能:仿真指定信噪比的信道 function out = ChanelSimulink(in, SNRdb)
SNR_dB
% SNR_db 设定信噪比 % in 输入信号序列 % out 信道输出序列 % 系统采样率 Fs = 50000;
Power_of_in = var(in); Power_of_noise
Power_of_in/(10.^(SNRdb/10));
% 信道带宽
bandwidth = 13500 - 10000; % 噪声功率谱密度值 W/Hz NO = Power_of_noise/bandwidth;
Gause_noise = sqrt(NO*Fs/2) .* randn(size(in)); % 噪声通道 10~13.5Hz
[num, den] = butter(4, [10000 13500]/(Fs/2));
=
_out));
% 测量得出信噪比 % 信道输出
out = signal_of_filter_out + noise_of_filter_out; SNR_dB clear; Fs = 50000;
% 读入信道输出信号数据
[recvsignal, Fs] = wavread('Chanel_OUT.wav'); t = (1/Fs:1/Fs:length(recvsignal)/Fs)'; % 本地载波频率 fc_local = 10000 -200; % 本地载波
local_carrier = cos(2*pi*fc_local.*t);
=
10*log10(var(signal_of_filter_out)/var(noise_of_filter
signal_of_filter_out = filter(num, den, in); noise_of_filter_out Gause_noise);
=
filter(num,
den,
% 相干解调
xianggan_out = recvsignal.*local_carrier;
wavwrite(demod_out, 'SSBDemod_OUT.wav'); subplot(1,
2,
Fs,
1);
% 设计 300~3400Hz 的带通滤波器 [fenzi, fenmu] = butter(3, [300 3400]/(Fs/2)); demod_out = filter(fenzi, fenmu, xianggan_out); sound(demod_out/max(demod_out), Fs);
plot(5*demod_out(53550:53750)); axis([0 200 -0.3 0.3]);
subplot(1, 2, 2); psd(5*demod_out, 10000, Fs); axis([0 25000 -20 10]);
解调后图像,可见仿真结果还行!
解调输出信号被保存为音频文件 SSBDemo_OUT.wav,并由 sound 函数播放。聆听播放解调输出信号的声音可知,在20dB信道信噪比条件下,即使解调本地载波频率误差达到 200Hz,声音仍然是清晰可懂的。