Matlab之声音处理:对wav音频信号量化

时间:2021-04-18 19:45:37

对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。

量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。

现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用

step1:

我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。

step2:对采集到的信号进行量化。

   方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)

      syms sample_point;
          syms quantizion_bits;
          sample_point = 200;
          quantizion_bits = 5;
          [y,fs,nbits]= wavread('road.wav',sample_point);
          sample = y(1:sample_point);
          n = 1:sample_point;
          q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器
          q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器
          mid_riser = quantize(q_riser,sample);%对采样信号进行量化
          mid_tread = quantize(q_tread,sample);%对采样信号进行量化
          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
          grid;
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
          grid;

   方法二:自己量化,更加灵活。

      syms sample_point;
          sample_point = 200;         %所需采集的声音样本点的数量
          [y,fs,nbits]= wavread('road.wav',sample_point);   %提取出音频信号的前200个点
          sample = y(1:sample_point);   %提取出左声道的信号
          n = 1:sample_point;          
          mid_riser = ones(sample_point,1);
          mid_tread = ones(sample_point,1);
          delta = 0.7/16;              %采样间隔
          for i = 1:sample_point         %采用mid-riser的方法
          inteval_rise = floor((sample(i) + 0.4)/delta);  %计算有的采样间隔数
          inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
          mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4;  %mid_riser的方法
          mid_tread(i) = delta*inteval_tread - 0.4;            %mid_tread的方法
          end
          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
          grid;
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
          grid;

      

    参考函数:

         wavread(wavread的具体使用,举例说明):

                 例子一:[Y,F,b]=wavread('test.wav');
                         Y2=Y(((F*10+1):F*20),:);
                         wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,

                                                          %因为你要把绝对路径加进去

                         %以上做的就是将这个音频的10~20秒给Y2。加入我们听到    

                         %一首歌需要对其中某一部分进行操作,就可以这样做。

                  例子二:[y,fs,nbits]= wavread(wavFile1);

                          %y就是音频信号;

                          %fs是采样频率,比如说16000就是每秒16000次;

                          %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精

                          wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点
                        

                  例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,

                          默认是wav  
                      例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点

                  例子五:[...]=wavread(FILE,[N1 N2]) 返回每个声道的从N1~N2的样本点