题目分析
调制解调通信系统实现。
录制一段语音信号,对其进行幅度调制解调,对比两端语音信号的频谱,并播放看其是否有偏差。在此基础上,将调制后的语音信号加上一个噪声,再滤波,观察恢复语音信号的失真现象。
需要完成以下任务:
- 采集一段语音信号
- 做原信号时域频域图
- 对语音信号进行幅度调制
- 做出解调后的频谱
- 调制解调前后做对比
- 调制后加噪声
- 解调观察对比
实验流程
原信号分析
本次实验从网络下载WAV格式的音频信号并将其长度裁剪为5s方便处理。
一般音乐和语音信号都是双声道信号,时域和频谱图会有两个颜色,所以要取单列来分析,通过x1=x(:,1)语句来实现。
首先利用audioread函数读取音频文件获得其频率等信息。
然后利用fft函数求傅里叶变换然后利用abs函数求幅值画幅度谱,再用plot画出频谱图。为了方便观察,可以利用fftshift对其进行左右互换,实验预留了一个接口is_shift当其值为1时整个实验的图像都采用fftshift变换,反之不做,方便灵活选择。
最终做出时域和频域的两个图形。
以上画了频谱图,可以更直观的看到信号的特征,包括截止频率和音频范围,音频信号主要集中在低频段。
幅度调制
这里统一使用了频率归一化,便于从原信号中读取截止频率和设置载波频率。
取一定频率的载波对信号进行AM调制,变量am_f表示载波信号的频率,经过反复调参,认为取0.6最为合适。这里取了0.6pi为调制载波频率,与原信号相乘实现AM调制,这里用点乘转置矩阵实现。
从图中可以看出原音乐信号的截止频率为0.2pi(图片对称轴减一),这里设置了0.6pi对信号进行AM调制,原信号的调制相当于频谱搬移,左移一个右移一个,调制的目的是便于信号在信道中传输。当调制频率较高时,声音响度低,几乎只能听见兹兹的声音,信号几乎完全失真,当调制频率较低时,声音很尖锐,响度较大,能听出调子,但也有兹兹的声音。
解调
- 首先对调制后的信号进行解调:将调制后的信号与调制时相同的载波相乘实现解调,这里用点乘转置矩阵实现。
- 然后用巴特沃斯滤波器对解调信号进行滤波:首先求巴特沃斯滤波器的频率响应,其中用到了buttord求满足性能指标的滤波器阶数N和3dB截止频率wc、用butter计算模拟滤波器的传输函数Ha(s)、用freqz求频响。然后用filter实现滤波。
- 最后播放调制、解调和滤波后的声音:通过声音变化感受调制、解调和滤波。
首先得到了解调后的时域波形和频谱图,可以看出解调后的信号并没有完全恢复原信号,会夹杂一点调制过程中的载波,通过滤波后信号频谱有了很大改善。播放声音发现:巴特沃斯滤波后声音清晰,基本和原来的音乐差不多,但是音乐稍微低沉。巴特沃斯滤波器的特点是通频带的频率响应曲线平滑。
加噪
- 信号加随机白噪声:首先求得随机白噪声,幅值为0.05,用randn语句产生噪声,然后将噪声和之前求得的原信号调制后的信号叠加。
- 滤掉噪声:我使用了巴特沃斯滤波器来滤噪,其中用到buttord求满足性能指标的滤波器阶数N和3dB截止频率wc、用butter求s域的频率响应的参数、用bilinear函数即利用双线性变换实现频率响应s域到z域的变换,然后用filter求滤波后信号。
从图中可以看到随机噪声的频谱图以及信号随机噪声后的时域波形和频谱,通过播放感受到了噪声对信号的影响;
滤波之后对噪声的改善很大,噪声变小,原声音更加清晰,只是巴特沃斯滤波会把一部分原信号频率滤掉,声音会有点低沉。
附:实验代码
clear;clc;close all;
[x,fs] = audioread('water.wav');%读取音乐信号
%输出频率
fprintf('fs1: %i \n',fs )
%音乐语音信号分声道处理
x_l=x(:,1);
n1=length(x_l);
t1=(0:(n1-1))/fs;%length取数列长度即元素个数
is_shift=1; % 预留接口,下面用来判断频谱是否使用fftshift
%=======================原音频时域/频域图=================================%
figure('NumberTitle', 'off', 'Name', '原音频时域/频域波形图');
%画音乐信号时域图
subplot(2,1,1);plot(t1,x_l);
axis([0,5,-0.5,0.5]);xlabel('时间t');ylabel('幅度');title('音乐时域波形');
%画音乐信号频域图
x_l_fft=fft(x_l,n1);
if is_shift==1 x_l_fft=fftshift(x_l_fft);end;
f1=0:fs/n1:fs*(n1-1)/n1;
subplot(2,1,2);plot(f1,abs(x_l_fft));
axis([0,fs,0,200]);xlabel('频率f');ylabel('幅度');title('音乐信号频谱');
%===========