实信号 x(t) 的希尔伯特变换就是将该信号中所有频率成分的信号份量移相 −π/2 而得到的新信号,记为 x ^ ( t ) \hat{x}(t) x^(t)。对于单频率正弦波信号,设 m(t) = Acos(2πft + φ),则其希尔伯特变换为
m ^ ( t ) = A cos ( 2 π f t + ϕ − π 2 ) = A sin ( 2 π f t + ϕ ) \hat{m}(t)=A \cos \left(2 \pi f t+\phi-\frac{\pi}{2}\right)=A \sin (2 \pi f t+\phi) m^(t)=Acos(2πft+ϕ−2π)=Asin(2πft+ϕ)
对於任意实周期信号 x(t),可用周期傅里叶级数展开表示为
x ( t ) = ∑ n = 0 ∞ a n cos ( 2 π n f t + ϕ n ) x(t)=\sum_{n=0}^{\infty} a_{n} \cos \left(2 \pi n f t+\phi_{n}\right) x(t)=n=0∑∞ancos(2πnft+ϕn)
希尔伯特变换为
x ^ ( t ) = ∑ n = 0 ∞ a n cos ( 2 π n f t + ϕ n − π 2 ) = ∑ n = 0 ∞ a n sin ( 2 π n f t + ϕ n ) \begin{aligned} \hat{x}(t) &=\sum_{n=0}^{\infty} a_{n} \cos \left(2 \pi n f t+\phi_{n}-\frac{\pi}{2}\right) \\ &=\sum_{n=0}^{\infty} a_{n} \sin \left(2 \pi n f t+\phi_{n}\right) \end{aligned} x^(t)=n=0∑∞ancos(2πnft+ϕn−2π)=n=0∑∞ansin(2πnft+ϕn)
实信号 x(t) 的解析信号 y(t) 是一个复信号,其实部为信号 x(t) 本身,其虚部为 x(t) 的希尔波特变换 x ^ ( t ) \hat{x}(t) x^(t)。即
y ( t ) = x ( t ) + j x ^ ( t ) y(t)=x(t)+\mathrm{j} \hat{x}(t) y(t)=x(t)+jx^(t)
例如对x(t)=cos(t)进行希尔伯特变换的程序如下:
t = 0:0.1:25;
s = cos(t);
s_h = hilbert(s);
plot(t,real(s,h),t,imag(s_h),'k--');
设基带信号为:
m ( t ) = ∑ n = 0 ∞ a n cos ( 2 π n f t + ϕ n ) m(t)=\sum_{n=0}^{\infty} a_{n} \cos \left(2 \pi n f t+\phi_{n}\right) m(t)=n=0∑∞ancos(2πnft+ϕn)
则以Acos(2pifc*t)为载波的双边带输出(DSB)信号为:
s D S B ( t ) = m ( t ) A cos 2 π f c t = A cos 2 π f c t ∑ n = 0 ∞ a n cos ( 2 π n f t + ϕ n ) = A 2 ∑ n = 0 ∞ a n cos ( 2 π ( f c + n f ) t + ϕ n ) + A 2 ∑ n = 0 ∞ a n cos ( 2 π ( f c − n f ) t − ϕ n ) . \begin{aligned} s_{D S B}(t) &=m(t) A \cos 2 \pi f_{c} t \\ &=A \cos 2 \pi f_{c} t \sum_{n=0}^{\infty} a_{n} \cos \left(2 \pi n f t+\phi_{n}\right) \\ &=\frac{A}{2} \sum_{n=0}^{\infty} a_{n} \cos \left(2 \pi\left(f_{c}+n f\right) t+\phi_{n}\right)+\frac{A}{2} \sum_{n=0}^{\infty} a_{n} \cos \left(2 \pi\left(f_{c}-n f\right) t-\phi_{n}\right).\end{aligned} sDSB(t)=m(t)Acos2πfct=Acos2πfctn=0∑∞ancos(2πnft+ϕn)=2An=0∑∞ancos(2π(fc+nf)t+ϕn)+2An=0∑∞ancos(2π(fc−nf)t−ϕn).
上式第一项为上边带,第二项为下边带。上边带的调制输出为:
s S S B ( t ) = A 2 ∑ n = 0 ∞ a n cos ( 2 π ( f c + n f ) t + ϕ n ) = A 2 ∑ n = 0 ∞ ( a n cos ( 2 π n f t + ϕ n ) cos 2 π f c t − a n sin ( 2 π n f t + ϕ n ) sin 2 π f c t ) = A 2 m ( t ) cos 2 π f c t − A 2 m ^ ( t ) sin 2 π f c t \begin{aligned} s_{S S B}(t) &=\frac{A}{2} \sum_{n=0}^{\infty} a_{n} \cos \left(2 \pi\left(f_{c}+n f\right) t+\phi_{n}\right) \\ &=\frac{A}{2} \sum_{n=0}^{\infty}\left(a_{n} \cos \left(2 \pi n f t+\phi_{n}\right) \cos 2 \pi f_{c} t-a_{n} \sin \left(2 \pi n f t+\phi_{n}\right) \sin 2 \pi f_{c} t\right) \\ &=\frac{A}{2} m(t) \cos 2 \pi f_{c} t-\frac{A}{2} \hat{m}(t) \sin 2 \pi f_{c} t \end{aligned} sSSB(t)=2An=0∑∞ancos(2π(fc+nf)t+ϕn)=2An=0∑∞(ancos(2πnft+ϕn)cos2πfct−ansin(2πnft+ϕn)sin2πfct)=2Am(t)cos2πfct−2Am^(t)sin2πfct
下边带为
s S S B ( t ) = A 2 m ( t ) cos 2 π f c t + A 2 m ^ ( t ) sin 2 π f c t s_{S S B}(t)=\frac{A}{2} m(t) \cos 2 \pi f_{c} t+\frac{A}{2} \hat{m}(t) \sin 2 \pi f_{c} t sSSB(t)=2Am(t)cos2πfct+2Am^(t)sin2πfct
设基带信号为一个在 150Hz 到 400Hz 内幅度随频率逐渐递减的音频信号,载波信号为 1000Hz 的正弦波,幅度为 1。仿真采样率设为 10000Hz,仿真时间 1 秒。求 SSB 调制输出信号波形和频谱。
clear;
Fs=10000; % 仿真的采样率
t=1/Fs:1/Fs:1; % 仿真时间点
m_t(Fs*1)=0; % 基带信号变量初始化
for F=150:400 % 基带信号发生:频率150Hz~400Hz
m_t=m_t+0.003*sin(2*pi*F*t)*(400-F); % 幅度随线性递减
end
m_t90shift=imag(hilbert(m_t)); % 基带信号的希尔伯特变换
carriercos=cos(2*pi*1000*t); % 1000Hz载波 cos
carriersin=sin(2*pi*1000*t); % 1000Hz正交载波 sin
s_SSB1=m_t.*carriercos-m_t90shift.*carriersin; % 上边带SSB
s_SSB2=m_t.*carriercos+m_t90shift.*carriersin; % 下边带SSB
% 下面作出各波形以及频谱
figure(1);
subplot(4,2,1); plot(t(1:100),carriercos(1:100),...
t(1:100),carriersin(1:100),'--r'); % 载波
subplot(4,2,2); plot([0:9999],abs(fft(carriercos))); % 载波频谱
axis([0 2000 -500 6000]);
subplot(4,2,3); plot(t(1:100),m_t(1:100)); % 基带信号
subplot(4,2,4); plot([0:9999],abs(fft(m_t))); % 信号频谱
axis([0 2000 -500 6000]);
subplot(4,2,5); plot(t(1:100),s_SSB1(1:100)); % SSB波形上边带
subplot(4,2,6); plot([0:9999],abs(fft(s_SSB1))); % SSB频谱上边带
axis([0 2000 -500 6000]);
subplot(4,2,7); plot(t(1:100),s_SSB2(1:100)); % SSB波形下边带
subplot(4,2,8); plot([0:9999],abs(fft(s_SSB2))); % SSB频谱下边带
axis([0 2000 -500 6000]);
对例题1产生的单边带(上边带)信号进行相干解调,仿真其解调波形和幅度频谱。
clear;
Fs=10000; % 仿真的采样率
t=1/Fs:1/Fs:1; % 仿真时间点
m_t(Fs*1)=0; % 基带信号变量初始化
for F=150:400 % 基带信号发生:频率150Hz~400Hz
m_t=m_t+0.003*sin(2*pi*F*t)*(400-F); % 幅度随线性递减
end
m_t90shift=imag(hilbert(m_t)); % 基带信号的希尔伯特变换
carriercos=cos(2*pi*1000*t); % 1000Hz载波 cos
carriersin=sin(2*pi*1000*t); % 1000Hz正交载波 sin
s_SSB1=m_t.*carriercos-m_t90shift.*carriersin; % 上边带SSB
out=s_SSB1.*carriercos; % 相干解调
[a,b]=butter(4, 500/(Fs/2)); % 低通滤波器设计4阶,截止频率为500Hz
demodsig=filter(a,b,out); % 解调输出
% 下面作出各波形以及频谱
figure(1);
subplot(3,2,1); plot(t(1:100),s_SSB1(1:100)); % SSB波形
subplot(3,2,2); plot([0:9999],abs(fft(s_SSB1))); % SSB频谱
axis([0 5000 -500 6000]);
subplot(3,2,3); plot(t(1:100),out(1:100)); % 相干解调波形
subplot(3,2,4); plot([0:9999],abs(fft(out))); % 相干解调频谱
axis([0 3000 -500 6000]);
subplot(3,2,5); plot(t(1:100),demodsig(1:100)); % 低通输出信号
subplot(3,2,6); plot([0:9999],abs(fft(demodsig)));% 低通输出信号的频谱
axis([0 3000 -500 6000]);
设计一个单边带发信机、带通信道和相应的接收机,参数要求如下。
(1)输入话音信号为一个话音信号,采样率 8000Hz。话音输入后首先进行预滤波,预滤5.6 单边带调幅系统的建模仿真 预滤波器是一个频率范围在 [300,3400]Hz的带通滤波器。其目的是将话音频谱限制在 3400Hz 以下。单边带调制的载波频率设计为 10KHz,调制输出上边带。要求观测单边带调制前後的信号功率谱。
(2)信道是一个带限高斯噪声信道,其通带频率范围是 [10000,13500]Hz。要求能够根据信噪比 SNR 要求加入高斯噪声。
(3)接收机采用相干解调方式。为了模拟载波频率误差对解调话音音质的影响,设本地载波频率为 9.8KHz,与发信机载波频率相差 200Hz。解调滤波器设计为 300Hz 到 3400Hz 的带通滤波器。
根据题设参数,系统中信号最高频率约为 14KHz。为了较好地显示调制波形,系统仿真采样率设为 50KHz,满足取样定理。由於话音信号的采样率为 8000Hz,与系统仿真采样率不相等,因此,在进行信号处理之前,必须将话音信号的采样率提高到 50KHz,可用插值函数来完成这一任务。
首先编写程序将基带音频信号读入,进行 [300,3400]Hz 的带通滤波,并将信号采样率提高到 50KHz,进行单边带调制之后,将调制输出结果保存为 wav 文件,程序如下。
[wav,fs]=audioread('GDGvoice8000.wav');
t_end=1/fs *length(wav); % 计算声音的时间长度
Fs=50000; % 仿真系统采样率
t=1/Fs:1/Fs:t_end; % 仿真系统采样时间点
% 设计300Hz~3400Hz的带通预滤波器H(z)
[fenzi,fenmu]=butter(3,[300 3400]/(fs/2));
% 对音频信号进行预滤波
wav=filter(fenzi,fenmu,wav);
% 利用插值函数将音频信号的采样率提升为Fs=50KHz
wav=interp1([1/fs:1/fs:t_end],wav,t,'spline');
wav_hilbert=imag(hilbert(wav)); % 音频信号的希尔伯特变换
fc=10000; % 载波频率Hz
SSB_OUT=wav.*cos(2*pi*fc*t)-wav_hilbert.*sin(2*pi*fc*t); % 单边带调制
figure(1); % 观察调制前后频谱
subplot(2,2,1); plot(wav(53550:53750)); axis([0 200 -0.3 0.3]);
subplot(2,2,2); psd(wav, 10000, Fs); axis([0 25000 -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); axis([0 25000 -20 10]);
audiowrite('SSB_OUT.wav',0.5*SSB_OUT,Fs); % 将SSB调制输出存盘备用
音频文件下载
为了仿真指定信噪比的信道,编写信道仿真函数如下:
function out=ch5example9prog2(in, SNRdB)
% SNR_dB 设定信噪比
% in 输入信号序列
% out 信道输出序列
Fs=50000; %系统采样率
Power_of_in=var(in);
Power_of_noise=Power_of_in/(10.^(SNRdB/10));
bandwidth=13500-10000; % 信道带宽
N0=Power_of_noise/bandwidth; % 噪声功率谱密度值W/Hz
Gauss_noise=sqrt(N0*Fs/2).*randn(size(in));
[num, den]=butter(4, [10000 13500]/(Fs/2)); % 带通信道10KHz到13.5KHz
signal_of_filter_out=filter(num, den, in);
noise_of_filter_out=filter(num, den, Gauss_noise);
SNR_dB=10*log10(var(signal_of_filter_out)/var(noise_of_filter_out))
% 测量得出的信噪比
out=signal_of_filter_out+noise_of_filter_out; % 信道输出
利用信道仿真函数计算 SSB 调制信号通过信道后的输出结果,例如计算出信道信噪比为 20dB 时的信道输出,并将结果保存为「 Channel OUT.wav 」文件,输出仿真的实际测量信噪比为 19.7dB,与设置值相符合。
clear;
[in, Fs] = audioread("SSB_OUT.wav");
SNRdB = 20;
out = ch5example9prog2(in, SNRdB);
audiowrite("channel_out.wav",out,Fs);
SNRdB =
19.6597
最后实现单边接收机:
clear;
[recvsignal, Fs]=audioread('Channel_out.wav');% 读入信道输出信号数据
t=(1/Fs:1/Fs: length(recvsignal)/Fs)';
fc_local=10000-200; % 本地载波频率9.8KHz
local_carrier=cos(2*pi*fc_local.*t); % 本地载波
xianggan_out=recvsignal.*local_carrier; % 相干解调
[fenzi,fenmu]=butter(3,[300 3400]/(Fs/2)); % 设计300Hz~3400Hz的带通滤波器
demod_out=filter(fenzi,fenmu,xianggan_out); % 对相干输出信号进行滤波
sound(demod_out/max(demod_out), Fs); % 播放解调音频
audiowrite('SSBDemod_OUT.wav',demod_out,Fs); % 保存输出信号
摘选的书籍:《MATLAB/Simulink通信系统建模与仿真实例分析》