FM调制解调原理+MATLAB音乐信号仿真

FM调制解调

前言

和幅度调制不同,角度调制是将信号m(t)信息包含到发送信号S(t)的相位上的一种手段(而幅度调制是将信息包含到幅值上)。

角度调制有两种方式,一种是相位调制(phase modulation——PM),一种是频率调制(frequency modulation——FM),也就是我们所说的调相和调频。

接下来主要介绍调频(FM)

FM调制原理

FM调制解调原理+MATLAB音乐信号仿真_第1张图片先看公式:
在这里插入图片描述
载波频率为fc,FM调制信号Sfm(t)由余弦信号Accos(2pifct) 在相位中加上消息信号m(t)积分乘以2piKfm后得到。

观察发现,如果对相位进行微分,则得到
FM调制解调原理+MATLAB音乐信号仿真_第2张图片
也就是说,消息信号m(t)被放在了频率中,所以这种调制方法叫做调频。

那么就自然衍生出来一个问题:

如果直接将m(t)放在fi(t)中,然后加到cos上不好吗?为什么要积分呢?

FM调制解调原理+MATLAB音乐信号仿真_第3张图片

类比自由落体中距离的计算,虽然速度v等于gt,但是距离并不是gt^2,同理,虽然频率是fc+kfmm(t),但是相位并不是直接乘以t。

所以需要积分

(可能解释的不清楚,大家可以看李晓峰老师的mooc——通信原理_中国大学MOOC(慕课) (icourse163.org)中4:20所讲)

FM解调原理(非相干解调法)

既然原信号是包含在Sfm(t)的频率中的,想要从中解调,就需要对其进行微分。

FM调制解调原理+MATLAB音乐信号仿真_第4张图片

微分后,发现原信号变道Sd(t)的包络上面了,所以现在需要提取包络。

这时候就需要用到希尔伯特变换了。

先看看希尔伯特变换(希尔伯特变换的作用是构造复信号,就是将信号x(t)构造成为x(t)+j*x(t)

FM调制解调原理+MATLAB音乐信号仿真_第5张图片

因为载波是正弦信号,根据欧拉公式正好能够凑成一个虚信号,直接求模能够得到包络了。

FM调制解调原理+MATLAB音乐信号仿真_第6张图片

然后将包络搬到x轴上,然后乘以合适的系数,就能够得到原信号了。

(别看讲了这么多,代码就两行)

MATLAB代码实现

0.准备

我准备了一段音乐,

采样率fs是44100(我自己测出来的,你要是不知道可以先执行[music,fs] = audioread(“music.mp3”),这样就知道fs是多少了)

截取了从1s到6s共5s的音乐片段。

取单声道并且转至为行向量(matlab读取的音乐本来是双声道列向量)。

[music,fs] = audioread('music.mp3',[1*44100+1,6*44100]);
dt = 1 / fs;                                            % 时间间隔
t_length = fs * 5;                                      % 5s
t = (1:t_length)*dt;                                    % 时间矢量
f = (1:t_length)*(fs/t_length) - fs / 2;                % 频率矢量
music_t = music(:,1)';

1.核心——调制部分

按照公式进行调制,得到singal_fm为fm调制信号。

%% 将音乐fm调频
fc = 10000;            	% 载波频率
k_fm = 100;           	% 频偏常数

% 对音乐信号进行积分
int_music(1) = 0;
for i=1:t_length-1
    int_music(i+1)=int_music(i)+music_t(i)*dt;
end
singal_fm = cos(2.*pi.*fc.*t + 2.*pi*k_fm.*int_music);

2.核心——解调部分

先微分后求包络,就两行代码

music_sdt = [0 diff(singal_fm)];        % 先对已调信号做微分
music_rt = abs(hilbert(music_sdt));     % 再构造解析信号求包络,得到非相干解调信号;

对music_rt进行整理

减去平均值搬移到x轴上,乘以100是因为100比较合适,不是说非得乘100

music_rt = music_rt - mean(music_rt);
music_rt = music_rt * 100;

3.实验现象

这是我的音乐信号和对应频谱(频率集中在4kHz)

FM调制解调原理+MATLAB音乐信号仿真_第7张图片

然后进行fm调制,又对fm调制信号加上高斯白噪声(信噪比为50dB)

对应频谱如下,可见频率集中在10kHz,原始fm信号只有10k附近有频率分量,而带噪音乐在全频率段上都存在频率分量

FM调制解调原理+MATLAB音乐信号仿真_第8张图片

FM调制解调原理+MATLAB音乐信号仿真_第9张图片

对其进行解调后得到解调音乐:

可以发现,从原始fm信号(无噪声)中提取出来的信号形状优美(虽然存在两个高频成分),而带噪fm信号中提取出的信号被噪声淹没(但是任然能够听出来音乐的存在)

FM调制解调原理+MATLAB音乐信号仿真_第10张图片

将提取出来的两个信号与原信号频谱对比如下:

发现都从中提取出了原信号,而带噪信号中有一个带宽从0到13kHz的噪声,这不是全频率上的高斯白噪声,可见非相干解调方法中有滤波器的成分。

FM调制解调原理+MATLAB音乐信号仿真_第11张图片

完整代码

clc;
clear;

% 作者:@_@滋行
% 时间:2022年9月27日
% 内容:音乐信号的fm调制解调

%% 获取音乐5s
[music,fs] = audioread('music.mp3',[1*44100+1,6*44100]);
dt = 1 / fs;                                            % 时间间隔
t_length = fs * 5;                                      % 5s
t = (1:t_length)*dt;                                    % 时间矢量
f = (1:t_length)*(fs/t_length) - fs / 2;                % 频率矢量
music_t = music(:,1)';
music_f = fftshift(fft(music_t));

% sound(music_t)

%% 将音乐fm调频
fc = 10000;            % 载波频率
k_fm = 100;           % 频偏常数

% 对音乐信号进行积分
int_music(1) = 0;
for i=1:t_length-1
    int_music(i+1)=int_music(i)+music_t(i)*dt;
end
singal_fm = cos(2.*pi.*fc.*t + 2.*pi*k_fm.*int_music);

music_noise = awgn(singal_fm,50);      % 添加高斯噪声 单位为db

figure;
subplot(211);
plot(t,music_t);xlabel('时间(S)');ylabel('幅度(V)');grid on;title('music(t)');
subplot(212);
plot(f,music_f);xlabel('频率(Hz)');ylabel('幅度(V)');grid on;title('原信号频谱');

singal_fm_f = fftshift(fft(singal_fm));
singal_fm_f = abs(singal_fm_f);
music_noise_f = fftshift(fft(music_noise));
music_noise_f = abs(music_noise_f);

figure;
subplot(211);
plot(f, singal_fm_f);title('原始调制音乐频谱');xlabel('频率(Hz)');ylabel('幅度(V)');
subplot(212);
plot(f, music_noise_f);title('带噪调制音乐频谱');xlabel('频率(Hz)');ylabel('幅度(V)');

%% 解调后播放
music_sdt = [0 diff(singal_fm)];        % 先对已调信号做微分
music_rt = abs(hilbert(music_sdt));     % 再构造解析信号求包络,得到非相干解调信号;

noise_sdt = [0 diff(music_noise)];      % 先对已调信号做微分
noise_rt = abs(hilbert(noise_sdt));     % 再构造解析信号求包络,得到非相干解调信号;

music_rt_f = fftshift(fft(music_rt));
music_rt_f = abs(music_rt_f);

noise_rt_f = fftshift(fft(noise_rt));
noise_rt_f = abs(noise_rt_f);


noise_rt = noise_rt - mean(noise_rt);
noise_rt = noise_rt * 100;
music_rt = music_rt - mean(music_rt);
music_rt = music_rt * 100;

figure;
subplot(211);
plot(t,music_rt);title('原始解调音乐');
subplot(212);
plot(t,noise_rt);title('带噪解调音乐');

music_rt_f = fftshift(fft(music_rt));
noise_rt_f = fftshift(fft(noise_rt));

figure;
subplot(211);
plot(f, music_f);title('原始解调音乐频谱对比');hold on;plot(f, music_rt_f);xlabel('频率(Hz)');ylabel('幅度(V)');
subplot(212);
plot(f, noise_rt_f);title('带噪解调音乐频谱对比');hold on;plot(f, music_f);xlabel('频率(Hz)');ylabel('幅度(V)');

% sound(music_rt,fs);
% sound(noise_rt,fs);

你可能感兴趣的:(从〇开始学通信,matlab,开发语言)