当前位置:   article > 正文

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

fm调制

FM调制解调

前言

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

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

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

FM调制原理

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

观察发现,如果对相位进行微分,则得到
在这里插入图片描述
也就是说,消息信号m(t)被放在了频率中,所以这种调制方法叫做调频。

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

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

在这里插入图片描述

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

所以需要积分

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

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

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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

在这里插入图片描述

然后将包络搬到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
  • 2
  • 3
  • 4
  • 5
  • 6

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.核心——解调部分

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

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

对music_rt进行整理

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

music_rt = music_rt - mean(music_rt);
music_rt = music_rt * 100;
  • 1
  • 2

3.实验现象

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

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

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

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

在这里插入图片描述

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

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

在这里插入图片描述

完整代码

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);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/95127
推荐阅读
相关标签
  

闽ICP备14008679号