jjzjj

音频信号调制,解调,加噪,去噪,滤波,matlab实现

Cheney822 2023-08-01 原文

题目分析

调制解调通信系统实现。

录制一段语音信号,对其进行幅度调制解调,对比两端语音信号的频谱,并播放看其是否有偏差。在此基础上,将调制后的语音信号加上一个噪声,再滤波,观察恢复语音信号的失真现象。

需要完成以下任务:

  • 采集一段语音信号
  • 做原信号时域频域图
  • 对语音信号进行幅度调制
  • 做出解调后的频谱
  • 调制解调前后做对比
  • 调制后加噪声
  • 解调观察对比

实验流程

原信号分析

本次实验从网络下载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('音乐信号频谱');

%============================AM调制=======================================%

n=0:n1-1;%所有元素
w=2*f1/fs;%归一化
am_f=0.6;%调制载波频率

%调制
x_cos=cos(n*am_f*pi);%时余弦信号
x_am=x_l.*x_cos';%调制信号
x_cos_fft=fft(x_cos); 
x_am_fft=fft(x_am);
if is_shift==1 x_am_fft=fftshift(x_am_fft);end;

%画出载波和调制信号波形
figure('NumberTitle', 'off', 'Name', 'AM调制图');
subplot(2,2,1);plot(t1,x_cos);
axis([0,0.005,-1,1]);title('余弦信号时域波形');xlabel('时间t');ylabel('幅度');

subplot(2,2,2);plot(w,abs(x_cos_fft));
title('余弦信号频谱');xlabel('w');ylabel('幅度');
subplot(2,2,3);plot(t1,x_am);
axis([0,5,-0.5,0.5]);title('调制信号时域波形');xlabel('时间t');ylabel('幅度');

subplot(2,2,4);plot(w,abs(x_am_fft));
title('调制信号频谱');xlabel('w');ylabel('幅度');

%播放调制信号
%sound(x_l,fs);pause(5);%播放原音乐
%sound(x_am,fs);pause(5);%低频调制播放

%============================解调========================================%

x_am_r=x_am.*x_cos'; %解调信号
x_am_r_fft=fft(x_am_r); %傅里叶变换
if is_shift==1 x_am_r_fft=fftshift(x_am_r_fft);end;

%画解调信号时域波形和频谱
figure('NumberTitle', 'off', 'Name', '解调时域/频域波形图');
subplot(2,1,1);plot(t1,x_am_r);
axis([0,5,-0.5,0.5]);xlabel('时间t');ylabel('幅度');title('解调信号时域波形');

subplot(2,1,2);plot(w,abs(x_am_r_fft));
xlabel('w');ylabel('幅度');title('解调信号频谱');


%巴特沃斯低通滤波器过滤信号,wp<ws为低通滤波器
wp=am_f;%设置通带频率
ws=am_f*1.1; %设置阻带频率
rp=1;%设置通带波纹系数
rs=50; %设置阻带波纹系数    

[N,wc]=buttord(wp,ws,rp,rs); %求满足性能指标的滤波器阶数N和3dB截止频率wc
[b,a]=butter(N,wc); %计算模拟滤波器的传输函数Ha(s)
[Hd,Ww]=freqz(b,a);%求频响

figure('NumberTitle', 'off', 'Name', '解调后滤波图');
subplot(3,1,1);plot(Ww/pi,abs(Hd));
axis([0,1,0,1.5]);xlabel('w/π');ylabel('幅度');title('巴特沃斯频率响应曲线');

%求巴特沃斯滤波器滤波信号
x_am_r_f=filter(b,a,x_am_r);%滤波后的音乐信号
x_am_r_f=x_am_r_f*2;

N3=length(x_am_r_f);
t1=(0:(N3-1))/fs;%时间
f1=0:fs/N3:fs*(N3-1)/N3;%频率
w1=2*f1/fs;%归一化
x_am_r_f_fft=fft(x_am_r_f);%傅里叶变换
if is_shift==1 x_am_r_f_fft=fftshift(x_am_r_f_fft);end;

subplot(3,1,2);plot(t1,x_am_r_f);
axis([0,5,-0.5,0.5]);
xlabel('时间t');ylabel('幅度');title('巴特沃斯滤波信号时域波形');

subplot(3,1,3);plot(w1,abs(x_am_r_f_fft));
xlabel('w');ylabel('幅度');title('巴特沃斯滤波信号频谱');

%sound(x_l,fs);pause(5);%原声音
%sound(x_am_r_f,fs);pause(5);%解调并用巴特沃斯滤波器滤波后的声音 


%============================调制后信号加噪===================================%

%加随机白噪声
x_noise=0.05*randn(n1,1);%噪声占比5%
x_noise_fft=fft(x_noise);%噪声傅里叶变换
if is_shift==1 x_noise_fft=fftshift(x_noise_fft);end;

%X_noise=x1+x_noise;%对调制后信号加随机噪声 
X_noise=x_am+x_noise;%对调制后信号加随机噪声 
X_noise_fft=fft(X_noise);%加噪信号傅里叶变换
if is_shift==1 X_noise_fft=fftshift(X_noise_fft);end;

figure('NumberTitle', 'off', 'Name', '加噪滤波频谱图');

subplot(3,2,1);plot(w,abs(x_noise_fft));
xlabel('w');ylabel('幅度');title('随机白噪声频谱图');

subplot(3,2,2);plot(t1,X_noise);
axis([0,5,-0.5,0.5]);
xlabel('时间t');ylabel('幅度');title('加随机噪声信号时域波形');

subplot(3,2,3);plot(w,abs(X_noise_fft));
xlabel('w');ylabel('幅度');title('加随机噪声信号频谱图');


%=======================含噪信号解调滤波==================================%
%先对含噪调制信号解调
X_noise_r=X_noise.*x_cos'; %解调信号
X_noise_r_fft=fft(X_noise_r); %傅里叶变换
if is_shift==1 X_noise_r_fft=fftshift(X_noise_r_fft);end;

%画解调信号时域波形和频谱
subplot(3,2,4);plot(w,abs(X_noise_r_fft));
xlabel('w');ylabel('幅度');title('含噪调制信号解调频谱');



%再用巴特沃斯滤波器去噪
noise_w = 0.4;
wp=noise_w;ws=noise_w+0.06;Rp=1;Rs=15;
[n1,Wn1]=buttord(wp,ws,Rp,Rs,'s');%求低通滤波器的阶数和截止频率
[bb1,aa1]=butter(n1,Wn1,'s');%求s域的频率响应的参数
[bb2,aa2]=bilinear(bb1,aa1,1);%利用双线性变换实现频率响应s域到z域的变换
%%subplot(3,2,2);plot(abs(bb2),aa2);
%%xlabel('w/π');ylabel('幅度');title('巴特沃斯频率响应曲线');

X_noise_r_f=filter(bb2,aa2,X_noise_r);%求滤随机噪声后的信号
%画滤噪后的图
filter_noisy_fft=fft(X_noise_r_f);
if is_shift==1 filter_noisy_fft=fftshift(filter_noisy_fft);end;

subplot(3,2,5);plot(t1,X_noise_r_f);
axis([0,5,-0.5,0.5]);
xlabel('时间t');ylabel('幅度');title('滤随机噪声后信号时域波形');

subplot(3,2,6);plot(w,abs(filter_noisy_fft));
xlabel('w');ylabel('幅度');title('滤随机噪声后信号频谱');

%播放
%sound(x_l,fs);pause(5);%原音乐
sound(X_noise,fs);pause(5);%加随机噪声
sound(X_noise_r_f,fs);pause(5);%滤随机噪声


有关音频信号调制,解调,加噪,去噪,滤波,matlab实现的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  3. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  6. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  7. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  8. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  9. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

  10. ruby - 实现k最近邻需要哪些数据? - 2

    我目前有一个reddit克隆类型的网站。我正在尝试根据我的用户之前喜欢的帖子推荐帖子。看起来K最近邻或k均值是执行此操作的最佳方法。我似乎无法理解如何实际实现它。我看过一些数学公式(例如k表示维基百科页面),但它们对我来说并没有真正意义。有人可以推荐一些伪代码,或者可以查看的地方,以便我更好地了解如何执行此操作吗? 最佳答案 K最近邻(又名KNN)是一种分类算法。基本上,您采用包含N个项目的训练组并对它们进行分类。如何对它们进行分类完全取决于您的数据,以及您认为该数据的重要分类特征是什么。在您的示例中,这可能是帖子类别、谁发布了该项

随机推荐