语音编码

该博客详细介绍了将WAV音频文件转换为数字信号并进行压缩和解压缩的过程。系统采用32个滤波器通道的滤波器组、离散余弦变换(DCT)、量化、哈夫曼编码,以及相应的反操作进行解码。通过MATLAB实现,包括语音读取、滤波器设计与应用、DCT与IDCT操作。虽然32通道的实现会消耗大量时间,但示例代码采用了4通道的简化模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.系统基本原理分析

1.1系统设计要求

将WAV 格式的模拟音频信号转换为数字信号,WAV格式的文件自己选择。

下面是需要完成的具体部分:

Encoder:   filter bank(32)                Decoder:   huffman decoding

          DCT/quantization                        IDCT/inverse quantiser     

          Huffman coding                         inverse filter bank

课题的输出要求及结果:

  1. 读取 WAV 格式的文件(没有压缩过的)
  2. 用Encoder 完成信号的压缩
  3. 显示并对比经过压缩后的信号的存储空间减小了   
  4. 用Decoder 完成信号的解码
  5. 在MATLAB 里经解码后的声音播放出来

1.2 系统设计方案

Encoder:   filter bank(32)                Decoder:   huffman decoding

          DCT/quantization                        IDCT/inverse quantiser     

          Huffman coding                         inverse filter bank

具体的理论分析与代码在2部分结合给出。

2.系统代码设计

·语音读取模块

语音读取的代码如下所示:

function [x,Fs,nbits] = func_readwav(resources);

[x,Fs,nbits]=wavread(resources);   

sound(x,Fs,nbits);

其波形如下所示:

·滤波器与滤波器反变化

    用窗函数法设计FIR滤波器组的基本思路为:

 (1)根据所要求的分析频率范围和频率分辨率选择一组分析频率ωk及相对应的原型理想低通滤波器的截止频率ωck(k=0,1,…,L-1),L为滤波器组的通道数,得出理想带通滤波器组的复合频率响应。

(2)用窗函数法近似实现各个理想带通滤波器。实际的复合频率响应等于理想复合频率响应与设计窗的频率特性的卷积。在用窗函数法设计FIR滤波器时,还需要知道通带内的纹波幅度δ,它可以根据阻带衰减量As的要求来确定,通常的典型值为

As=-20lgδ=40∽60                                              (1)

如果选择Kaiser窗,参数β的计算公式为

当As >50时,β=0.1102(As-8.7);

当21<As <50时,β=0.5845(As-21)0.5+0.07886(As-21)。            (2)

滤波器的阶数为

        M=(As-7.95)/14.36△F+1                                         3)

式中△F是归一化过渡带宽,即△F=△f•T,而

        △f=△ω/2π                                                   (4)

过渡带宽△ω的选择根据对每个滤波器的频率分辨率要求来决定,必须满足限制条件

△ωk<2ωck                                                     (5)

如果各通道采用相同的设计窗,保证中心频率及带宽的选择能覆盖-π到π频率范围(不管滤波器的中心频率和带宽如何分布),那么最终得到的实际复合响应一定是理想的,即具有平坦幅度和线性相位。

   

 

首先计算各个通道下的滤波器H0,H1,H2,。。。。。H31。

然后分别进行滤波。得到各个通道下的滤波效果;

 

反滤波过程。

g0=-wrev(H(1,:));

g1=-wrev(H(2,:));

…………

首先对各个H,取逆。然后作为反滤波器函数G。

然后再次分别进行滤波从而得到各个通道下的滤波后的数据,然后将各个通道下的数据相加得到原始的信号。

load H.mat;

if select == 1

g0=-wrev(H(1,:));

g1=-wrev(H(2,:));

g2=-wrev(H(3,:));

g3=-wrev(H(4,:));

x_recon=filter(g0,1,datas(1,:))+filter(g1,1,datas(2,:))+filter(g2,1,datas(3,:))+filter(g3,1,datas(4,:));

end

if select == 0

x_recon    = datas;

end  

注意,由于本系统采32子通道的话将耗费大量的仿真时间,因此,本系统暂时采用的4通道的仿真模式。其滤波器组的仿真结果如下所示;

    【采用32个通道的时候,仿真时间超级长,所以先给你做出基本的东西,如果没什么问题,改为32个通道就OK。】

 

·DCT与IDCT

我们在这里使用MATLAB内部的dct函数。这里就不多做介绍了。

这里比较简单,就是MATLAB自带的函数,dctidct两个函数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fpga和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值