EDA365电子论坛网

标题: Matlab之声音处理:对wav音频信号量化 [打印本页]

作者: haidaowang    时间: 2020-9-11 16:37
标题: Matlab之声音处理:对wav音频信号量化

# v3 ^* L# U( j& Q* T3 ]# `对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。% e. \1 h8 L9 U1 K7 j
8 ~5 u2 |$ S  u6 R
量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
4 o3 P6 k& z- s" F7 N. J8 V( x& l2 I
% c5 D: a( G3 l9 e现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用
2 z& l3 y! F6 z! w5 {3 ?9 M& }1 N! I  D* F& H6 E
step1:
0 g$ |8 _' j9 d) ]; c( `7 I
. g( P3 i# Y' h+ k3 I) ]我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。; T/ |& F+ `( T3 L
+ }8 D) x% k* K3 o  L' `
step2:对采集到的信号进行量化。+ g/ w, W& n3 y. j& U5 w7 Y

1 ~! a9 M$ [& a9 t   方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化): Q$ \! O9 N6 `" t3 O4 c+ Z1 j

8 i- ?* t. m- |  [2 l$ f( ^+ w+ |6 t      syms sample_point;
7 b. Y; E7 L  j7 @          syms quantizion_bits;
; k+ u1 u1 d% p% c3 ^          sample_point = 200;4 F$ W; ^6 J, K" T  ]6 K
          quantizion_bits = 5;/ R! h! S, s9 W9 {/ f3 O
          [y,fs,nbits]= wavread('road.wav',sample_point);
3 N* V5 z% j2 q  _: x          sample = y(1:sample_point);
2 f. j, C8 e+ z. o% Q          n = 1:sample_point;
1 k, x$ c7 t/ V          q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器
. J6 F! O  R' }          q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器
" g8 D7 I- v7 w# ~: |& f          mid_riser = quantize(q_riser,sample);%对采样信号进行量化
7 y- {* ], q/ J2 Z9 A7 |          mid_tread = quantize(q_tread,sample);%对采样信号进行量化
$ i  k( S6 E$ e& q& H8 ~0 d1 T          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
& N2 U$ b$ t+ b8 x: o3 w" X/ \  d# s          grid;4 @, F. A  z2 g4 z, O& B3 P
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
$ U+ k& B9 }  q7 Q9 @          grid;( m7 U' B! D5 `; h) N2 U/ H1 J
9 f' X0 k$ E: S" z& I+ [) @8 Q# j
   方法二:自己量化,更加灵活。
6 z* L0 _3 Q/ q: K. T: C% Y+ F2 ]7 z* c) P% Y, j
      syms sample_point;
" A3 Q# |3 z" I. M          sample_point = 200;         %所需采集的声音样本点的数量9 U  T% n# O; C0 ^
          [y,fs,nbits]= wavread('road.wav',sample_point);   %提取出音频信号的前200个点
" D, U8 Z, F2 J          sample = y(1:sample_point);   %提取出左声道的信号! p7 k; Z$ F2 T8 g. u- v
          n = 1:sample_point;          $ q) C/ F; A9 A- v& X' U
          mid_riser = ones(sample_point,1);0 J% m' t# i5 l  J! d8 k
          mid_tread = ones(sample_point,1);
0 c# ^5 ^& @( l8 [" ^          delta = 0.7/16;              %采样间隔* r7 v* d8 _' ?: H; A
          for i = 1:sample_point         %采用mid-riser的方法
0 p& _4 c8 R6 x: j" X) b5 x          inteval_rise = floor((sample(i) + 0.4)/delta);  %计算有的采样间隔数
' w9 a  m( R8 t$ U          inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %- ^7 _# K" `2 I2 |, H/ _, j
          mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4;  %mid_riser的方法& r- A& R8 P; m7 Q( |
          mid_tread(i) = delta*inteval_tread - 0.4;            %mid_tread的方法. \4 ?" d9 k4 P) ^' m" q
          end
- s2 `. W/ N% H* Z! _. I          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
" A/ _; H  a1 ]1 C( _$ l- z, j          grid;1 F* N, z% f: A/ M# E( U- t0 M
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
5 z: Y7 h# l% M9 l, i2 U3 N4 u$ b' l          grid;
, O9 X0 L" U  T. A4 b5 K- h, g8 N3 O( Z# J
      
$ A% s% k' n0 f3 O0 s( m3 F
. }9 A) q2 F& z( b6 H+ e    参考函数:
3 \/ s! `- R4 S; }
* J, C$ g0 F# \6 r; _         wavread(wavread的具体使用,举例说明):
+ f+ M* d! z0 z: q8 ~
8 \( a/ R4 B. P1 H! H% h                 例子一:[Y,F,b]=wavread('test.wav');# \2 V8 F) ]# l# ?2 ~- y: U4 k- a
                         Y2=Y(((F*10+1):F*20),:);
" W  t: q* e# u% u0 \7 x                         wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,
. x, \1 p" C# q4 Y
3 q' G$ d3 J4 y' }% v( C# j+ ]- X9 P                                                          %因为你要把绝对路径加进去9 f/ o' f: d8 D, M1 A/ m

$ R+ Y8 I) e1 t- D! V* X1 t" N9 w% z! `                         %以上做的就是将这个音频的10~20秒给Y2。加入我们听到    3 O" u4 ?6 N0 J8 N0 a

. d8 a8 d; e0 k. C1 F9 Q                         %一首歌需要对其中某一部分进行操作,就可以这样做。% M, o; J; I* _! l& m+ R
9 B' I9 ~& V1 m& P& r
                  例子二:[y,fs,nbits]= wavread(wavFile1);0 k  y) \0 u2 U+ R6 u+ I
0 a) W) w( {. p" l; ~
                          %y就是音频信号;
' h5 j9 n  H4 r" M4 X2 q9 F% g2 J$ K& `: ?, J. J/ \* K6 z" ?
                          %fs是采样频率,比如说16000就是每秒16000次;
% t6 Y0 v1 b2 d% l, j0 p+ P0 V# a1 g* [$ Y" @* ~5 @
                          %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精
! T4 S$ Q5 C* C- K& `1 J
  k$ q3 h4 W: _9 a* N) l" k                          wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点
$ d* X2 `" g# B: I% v                        
! I# Y( b/ y) z1 B! n; y
/ ]# k( h8 Q: e' K4 m                  例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
% d) ^8 D8 m* G: Z8 x5 B
" o! J2 a5 n* d6 L* x                          默认是wav  * h; M0 E8 y3 w0 Z7 h. `+ S. n1 U
                      例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点
6 ^% W5 ]4 Z9 k: c! M
. \0 m* Q  F9 a  o% {* n* L                  例子五:[...]=wavread(FILE,[N1 N2]) 返回每个声道的从N1~N2的样本点
作者: younicp    时间: 2020-9-11 16:55
Matlab之声音处理:对wav音频信号量化




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2