Matlab系统建模实践

该博客详细介绍了使用MATLAB进行语音信号处理的过程,包括语音信号的采集与分析、IIR低通滤波器设计、非均匀量化编码与解码,以及GUI界面的创建。实验结果表明,该方法能有效降低噪声并进行低失真编码解码。不足之处在于未考虑立体声信号和失真度分析。
摘要由CSDN通过智能技术生成

语音数字化量化噪声的改善(脉冲编码调制PCM)

一、主要任务

(1) 采集语音信号(模拟信号),并画出其时域图与频域图
(2) 对信号进行滤波处理
(3) 利用非均匀量化方法对信号进行编码
(4) 对编码过的信号进行解码,还原语言信号,并画出其时域图与频域图,并和原始信号进行比较
(5) 设计GUI界面,包括原始信号采集按钮(显示时域图与频域图)、滤波按钮(显示时域图与频域图)、编码按钮、解码按钮(显示时域图与频域图)

二、相关内容(略)

(1) 语音滤波降噪

(2) 均匀量化与非均匀量化

(3) 脉冲编码调制PCM

三、设计思路

(1) 采集音频并分析

调用matlab中读取音频文件的函数audioread采集音频信号,对这个信号加入噪声,噪声的频率为12.5KHz再通过快速傅里叶变换fft函数做出频域图。

[husheng0,fs]=audioread('H:\husheng_matlab0.mp3');%单声道
%sound(hushung0,fs);%播放
T=1/fs;%采样周期
l=length(husheng0);%信号长度
t=(0:l-1)*T;%时域范围
tt=(1:l);
noise=0.02*cos(12500*2*pi/fs*tt');%噪声
husheng=husheng0+noise;%加噪声
husheng1=fft(husheng,l)*T;
H=fftshift(husheng1);
S=abs(H);
F=2*pi*fs;%频率
FF=(-F/2+(0:l-1)*F/l)/(2*pi);

(2) 设计IIR低通滤波器

这次采用IIR巴特沃斯低通滤波器。因为人声的频率在300Hz到3.4KHz左右,所以设计了两种不同的技术指标的滤波器(10KHz和5KHz),以10KHz的为例,通带边界频率Fp为2000Hz,阻带边界频率Fs为1000Hz,通带最大衰减为2dB,阻带最小衰减为80dB。

Rp=2;Rs=80;%10khz
%Rp=1;Rs=60;%5khz
%Ft=48000;%我的test参数
%Ft=44100;%周杰伦的参数
Ft=8000;Fp=1000;Fs=2000;%备选参数1  10khz
%Fp=2000;Fs=4000; %参数2   5khz
Wp=2*pi*Fp/Ft;
Ws=2*pi*Fs/Ft; %求出待设计的模拟滤波器的边界频率
[N,Wn]=buttord(Wp,Ws,Rp,Rs, 's'); %低通滤波器的阶数和截止频率
[B,A]=butter(N,Wn, 's'); %S域频率响应的参数即:滤波器的传输函数
[Bz,Az]=bilinear(B,A,0.5); %利用双线性变换实现频率响应S域到Z域的变换

(3)音频滤波并分析

采用一维数字滤波器函数,调用上面产生的低通滤波器对信号进行滤波。

husheng2=filter(Bz,Az,husheng);%滤波处理

再对滤波后的信号进行快速傅里叶变换,做出时域图和频域图。

husheng3=fft(husheng2);
%sound(husheng2,fs);%播放一下
%滤波后时域频域图
H1=fftshift(husheng3);
S1=abs(H1);

(4) 编码与解码

编码与解码采用A律13折线法,均做成函数,这样子方便在后来的过程中进行调用。并且为了保证信号幅度的完整性,解码时加入一个归一化操作,即mas的值(信号幅度的最大值),以便解码恢复到原来的幅度。

%非均匀量化对信号编码
function code = PCMcoding(S)
z=sign(S);
    MaxS=max(abs(S));
    S=abs(S/MaxS);
    Q=2048*S;
    code=zeros(length(S),8);
    
    for i=1:length(S)
        if (Q(i)>=128)&&(Q(i)<=2048)
            code(i,2)=1;
        end
        if (Q(i)>32)&&(Q(i)<128)||(Q(i)>=512)&&(Q(i)<=2048)
            code(i,3)=1
        end
        if (Q(i)>=16)&&(Q(i)<32)||(Q(i)>=64)&&(Q(i)<128)||(Q(i)>=256)&&(Q(i)<512)||(Q(i)>=1024)&&(Q(i)<=2048)
            code(i,4)=1;
        end
    end
    
    N=zeros(length(S));
    
    for i=1:length(S)
        N(i)=bin2dec(num2str(code(i,2:4)))+1;
    end
    
    。。。。。
 
end

%对信号解码
function s = PCMdecoding(encode,max)
encode=(reshape(encode',8,length(encode)/8))';
    l=size(encode,1);
    a=[0,16,32,64,128,256,512,1024];
    b=[1 1 2 4 8 16 32 64];
    c=[0 1.5:15.5];
    for i=1:l
        x=encode(i,1);
。。。。。。。
        if Y==0
            k(i)=a(T)/2048;
        else
            k(i)=(a(T)+b(T)*c(Y))/2048;
        end
        if x==0
            s(i)=-k(i);
        else
            s(i)=k(i);
        end
    end
    s = s.*max;
 
end

(5) GUI界面设计

GUI界面设计共有四个按钮,分别控制:采集信号(时域图与频域图)、滤波器(滤波器特性曲线)、滤波后的信号(时域图与频域图)、编码、解码(时域图与频域图)。
点击按钮“原音频”进行信号的采集与分析,之后点击“滤波器”,做出所采用的低通滤波器的特性曲线,再点击“滤波”,做出滤波后的信号的时域图与频域图,接着点击“编码”对滤波后的信号进行编码,等待编码完成后将会显示“编码完成”点击“解码”,即做出解码后的信号的时域图与频域图。
在这里插入图片描述

四、结果与不足之处

(1)实验的结果符合预期的要求,能够完成对音频信号进行较低失真度的编码与解码。
在这里插入图片描述

(2)不足之处
在对信号进行采集的时候,时域坐标不符合实际,即时域坐标是采样点的个数,这个在请教老师之后及时进行了改正的。另外音频信号大多有左右声道,本次实践默认为单声道,缺少实际问题的多方面考虑,可以再添加一个对单声道和立体声的判断,在之后的编码与解码过程中也对单声道和双声道的问题进行考虑,做出两者不同的编码与解码。另外还可以加入失真度分析,即加入一个失真度测量算法,计算编码与解码过程中的失真度大小。

五、参考资料

(1) 《基于MATLAB的PCM编码解码实现》CSDN博主「virlaser」,原文链接:https://blog.csdn.net/weixin_44041884/article/details/86354999
(2) 《基于MATLAB的音频信号低通滤波实验》CSDN博主「和嘻泥」,原文链接:https://blog.csdn.net/qq_43160569/article/details/86544542
(3) 《如何用MATLAB设计GUI》CSDN博主「qq_26895463」,原文链接:https://blog.csdn.net/qq_26895463/article/details/81002338

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.胡Sir.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值