matlab中音乐ssb调制,基于音频信号的AM、SSB、DSB、FM调制MATLAB仿真

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

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

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信号为例

调制:

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); % 滤除直流分量

调制:

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

解调:

同上

调制:

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

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

证明如下:

8d22390efde21129a15a7c9ac8767bab.png

解调:

同上

看了网上很多文章,大多是对单频的信号进行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:

5c75b5b65005a70b6f4822f2b4587a0c.png

DSB:

9e27ad0e97490dd8024cc325663c4647.png

SSB:

057c66dd4f37a02f20579720256cbc11.png

FM:

6bdf37b3bbdd39db5f03d64dd56e843d.png

仿真文件代码:【radioStation.m】

文章观点或有偏颇之处,如有问题,请多多交流。

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

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab可以使用dsbmod函数实现DSB调制、ammod函数实现幅度调制(AM)、ssbmod函数实现单边带调制(SSB)和vestigialmod函数实现余边抑制调制(VSB)。 DSB调制示例代码: ```matlab fc = 1000; %载波频率 fs = 10000; %采样频率 t = 0:1/fs:1; %时间序列 Ac = 1; %载波振幅 Am = 0.5; %调制信号振幅 fm = 10; %调制信号频率 m = Am*cos(2*pi*fm*t); %调制信号 c = Ac*cos(2*pi*fc*t); %载波信号 s = m.*c; %调制信号与载波信号相乘 dsb = dsbmod(m,fc,fs); %使用dsbmod函数进行DSB调制 ``` 幅度调制(AM)示例代码: ```matlab fc = 1000; %载波频率 fs = 10000; %采样频率 t = 0:1/fs:1; %时间序列 Ac = 1; %载波振幅 Am = 0.5; %调制信号振幅 fm = 10; %调制信号频率 m = Am*cos(2*pi*fm*t); %调制信号 c = Ac*cos(2*pi*fc*t); %载波信号 s = m.*c; %调制信号与载波信号相乘 am = ammod(m,fc,fs); %使用ammod函数进行幅度调制 ``` 单边带调制(SSB)示例代码: ```matlab fc = 1000; %载波频率 fs = 10000; %采样频率 t = 0:1/fs:1; %时间序列 Ac = 1; %载波振幅 Am = 0.5; %调制信号振幅 fm = 10; %调制信号频率 m = Am*cos(2*pi*fm*t); %调制信号 c = Ac*cos(2*pi*fc*t); %载波信号 s = m.*c; %调制信号与载波信号相乘 ssb = ssbmod(m,fc,fs); %使用ssbmod函数进行单边带调制 ``` 余边抑制调制(VSB)示例代码: ```matlab fc = 1000; %载波频率 fs = 10000; %采样频率 t = 0:1/fs:1; %时间序列 Ac = 1; %载波振幅 Am = 0.5; %调制信号振幅 fm = 10; %调制信号频率 m = Am*cos(2*pi*fm*t); %调制信号 c = Ac*cos(2*pi*fc*t); %载波信号 s = m.*c; %调制信号与载波信号相乘 vestigial = vestigialmod(m,fc,fs); %使用vestigialmod函数进行余边抑制调制 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值