欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于音频信号的AM、SSB、DSB、FM调制MATLAB仿真

程序员文章站 2022-07-02 21:11:01
...

一、读取音频

MATLAB自带一系列音频,例如:chirp(鸟叫声)、train(火车鸣笛)……调用方法如下:

load chirp;
% load train;

load上述信号后,可以看到工作区出现两个变量y(音频信号),Fs(音频信号采样频率)。

注:MATLAB自带的音频信号采样率Fs = 8192Hz。

二、采样率的那些坑



错误代码1:
如果你使用了下面的代码,程序结果一定会让你十分疑惑。

load chirp;		% y, Fs
N = length(y - 1);
fc = 20e3;		% 载波频率
t = (0:N - 1) / Fs;
st = (y + 0.2) .* cos(2 * pi * fc * t);		% AM信号为例

当你对上述代码生成的信号st进行频谱分析时,会发现频率与理论值不符。问题在于,音频信号的采样频率 Fs = 8192Hz,但采用20KHz的载波,不符合奈奎斯特采样定律。



错误代码2:
如果你使用了下面的代码,程序结果依然会让你十分疑惑。

load chirp;		% y, Fs
N = length(y - 1);
fc = 20e3;		% 载波频率
fs = 4 * fc;	% AM信号采样频率
t = (0:N - 1) / fs;
st = (y + 0.2) .* cos(2 * pi * fc * t);		% AM信号为例

虽然进行了一定修改,但上述代码仍然存在一定问题。问题在于,上述代码仅仅提高了载波 cos(2 * pi * fc * t) 的采样率,音频信号 y 的采样率为 Fs ,但你却将 y 的采样率硬生生看做 fs = 4 * fc



正确的打开方式:
最终,我们明白了问题所在,并解决了问题。

fc = 20e3;
fs = 4 * fc;               	% 对载波的采样频率

y = resample(y,fs,Fs);     	% 关键,对音频信号进行再采样
N = length(y);
t = (0:N - 1) / fs;
st = (y + 0.2) .* cos(2 * pi * fc * t);		% AM信号为例


三、AM调制与解调

调制:

k = 0.2;		% 控制调幅指数
st = (y + k) .* cos(2 * pi * fc * t);		% AM信号为例

解调:

sr = st .* cos(2 * pi * fc * t);		% 相干解调
point = 6000 / (Fsr / 2);      % 6000Hz略大于chirp音频信号的最高频率
bhi = fir2(34,[0 point point 1],[1 1 0 0]);
freqz(bhi,1,Nr);
yo = filter(bhi,1,yo);                  % 低通滤波
yo = yo - mean(yo);                     % 滤除直流分量

四、DSB调制与解调

调制:

st = y .* cos(2 * pi * fc * t);		% AM信号为例

解调:
同上

五、SSB调制与解调

调制:

y1 = imag(hilbert(y));	% MATLAB函数问题,虚部才是希尔伯特变换

st = 0.5 * y .* cos(2 * pi * fc * t) + 0.5 * y1 .* sin(2 * pi * fc * t);	% +,-均可,对应不同边频

证明如下:
基于音频信号的AM、SSB、DSB、FM调制MATLAB仿真

解调:
同上

六、FM调制与解调

看了网上很多文章,大多是对单频的信号进行FM调制解调仿真的。采用单频信号仿真具有一定的局限性,其仿真结果可能会使得我们对FM信号的特点理解产生误差。下面,我们采用一段复杂频率的音频信号,实现FM调制、解调仿真,并阐述其中一系列注意事项。

调制:
FM调制的原理、公式,本文不再赘述,大家可以轻易地在网上查找到FM调制的公式及原理。在此,我们重点介绍,面对一段实际的音频信号,如何合理地确定FM调制的“调频灵敏度Kf”。

我们基于以下两个公式进行讨论:

B = 2 * (dfm  /  Fmax + 1) * Fmax = 2 * (dfm + Fmax)
dfm = kf * max(abs(mt)) / (2 * pi)

其中,
B为调频信号的近似带宽(事实上,调频信号带宽无限大),
mt为基带信号,
Fmax为基带信号mt的上限频率,
dfm为使用mt进行调频后,最大的调频频率。

我们的目的是求解 Kf 。通常,我们可以通过频谱分析,获得基带信号的上限频率 Fmax ,因此,Fmax 是已知的。而调频信号带宽B,应满足如下公式:

B / 2 < fc			---(1)
B / 2 + fc < fs / 2	---(2)

公式(1)保证调频信号正、负频谱不会重叠
公式(2)保证调频信号满足采样率要求

由此,我们可以求解出 dfm ,进而得到 Kf ,公式如下:

B = min(2 * fc, fs - 2 * fc);
B = B * 0.9;				% 留一定的带宽余量,系数<=1
dfm = B / 2 - Fmax;			% Fmax通过对mt频谱分析得到

kf = 2 * pi * dfm / max(abs(mt));

现在,我们就求解出了合理的 Kf下面展示FM调制MATLAB仿真代码:

Fmax = 4800;           	% chirp信号的最高频率大概是4800Hz,Fmax对应音频信号最高频率
Bfm = min(2 * fc,Fst - 2 * fc);
Bfm = Bfm * 0.9;       	% 留下一定的带宽余量
dfm = Bfm / 2 - Fmax;  	% dfm表示由音频信号调频产生的最大频偏
kf = 2 * pi * dfm / max(abs(y));
phi = cumsum(y) / Fst;	% 积分
yi = cos(2 * pi * fc * tt + kf * phi);

解调:
本文只列出非相干解调(包络检波)的方法(相关理论推导以及相干解调的方法可以参考其它网络博客),代码如下:

% FM信号解调,利用希尔伯特变换实现包络检波(非相干解调)
ydt = diff(out);
yo = [0 abs(hilbert(ydt))];
yo = yo - mean(yo);			% 滤除直流分量

注意事项:
1、FM 信号的仿真, Kf 的选择尤其重要,直接影响了仿真的结果。
2、FM 信号包络不一定是恒定的,因为FM信号的带宽无限大,很可能出现各个分量叠加、抵消的情况。(网上大多用单频信号进行 FM 调制,他们的实验结果给我造成很大的困惑。)

七、仿真结果

将原始的音频信号、解调后的音频信号,利用sound函数对比,基本没有质量损失,下面展示时域信号及其频谱。

AM:
基于音频信号的AM、SSB、DSB、FM调制MATLAB仿真
DSB:
基于音频信号的AM、SSB、DSB、FM调制MATLAB仿真
SSB:
基于音频信号的AM、SSB、DSB、FM调制MATLAB仿真
FM:
基于音频信号的AM、SSB、DSB、FM调制MATLAB仿真

八、结语

仿真文件代码:【radioStation.m】
文章观点或有偏颇之处,如有问题,请多多交流。