找回密码
 注册
关于网站域名变更的通知
查看: 551|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-9-11 16:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
1 f5 w9 _7 T# c: I6 M% Z
对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。
" o* n: Q8 Y4 {: j3 J$ K2 ~  e# h2 c2 W
量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
) z2 w% ?1 x- k# H7 u8 u8 F/ z6 ]' V
现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用  e; |( N8 W6 f/ W) Q2 }+ [+ z
$ Z+ v. [8 b7 G3 |: u
step1:+ K2 _4 X+ K: a, m: u2 B4 v

7 \% S+ Y* C$ p, d: D我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。
: ]( \. Y2 t) C; ]5 f! p& h8 ]
0 \8 R% @0 p7 Jstep2:对采集到的信号进行量化。
: F5 t* q7 I( E( Y  u
8 U+ C; u6 _% X   方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
  b& \5 s! ?* W4 M  [/ Q9 X9 F& N1 N( f, w
      syms sample_point;; O" @, K" b& O5 P! a" F
          syms quantizion_bits;8 ~7 B- D7 \# v" q1 s" {
          sample_point = 200;
1 L$ }+ ?2 k! R          quantizion_bits = 5;
# N; D% H4 c. c  T$ F$ A  y. g+ C          [y,fs,nbits]= wavread('road.wav',sample_point);
1 \, \& p7 d9 E7 E6 G" N          sample = y(1:sample_point);
' ^4 I3 R8 `5 ^8 |* s/ l          n = 1:sample_point;
" ]; g& ?# }: _          q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器) E2 b, I  `: e. K/ l
          q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器; L/ Q% o$ y3 m7 {! C
          mid_riser = quantize(q_riser,sample);%对采样信号进行量化
: @% h9 x/ j) k# V! x          mid_tread = quantize(q_tread,sample);%对采样信号进行量化
. h+ o3 ]: c6 a' ^: [3 E- V          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
! L6 O5 o8 T- _  `( V# q          grid;
% W: Z" J/ E$ W7 K& v  x          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
/ k7 {5 g, ?# X  }          grid;
. O  m! O) K+ w. L& u
3 [. @% y) g% K4 X7 x! n# a* L+ d: _   方法二:自己量化,更加灵活。
7 v* v6 n9 u( l' o. J6 w/ S
2 K8 L. t( D2 `% d) l# Q% z      syms sample_point;
2 m5 |3 G* e- x+ T& n          sample_point = 200;         %所需采集的声音样本点的数量- f9 P& P$ k3 S$ w  e
          [y,fs,nbits]= wavread('road.wav',sample_point);   %提取出音频信号的前200个点
- j0 D7 o5 T* K          sample = y(1:sample_point);   %提取出左声道的信号
. J) K8 W& A( R          n = 1:sample_point;         
) K6 u8 U+ Q6 Q& q9 ^          mid_riser = ones(sample_point,1);( a! ?( k: k- F  L+ o
          mid_tread = ones(sample_point,1);4 }5 ^, Y1 O' y1 u0 s" c4 ~
          delta = 0.7/16;              %采样间隔
9 ?* ~" d1 y5 t& n2 \4 `- K          for i = 1:sample_point         %采用mid-riser的方法
0 @: P9 |* t6 S( B1 M9 b$ [' s          inteval_rise = floor((sample(i) + 0.4)/delta);  %计算有的采样间隔数
! K% [6 u/ f( r) c  F          inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %( a' q. s  `. C* t7 ]7 o1 n
          mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4;  %mid_riser的方法
8 h4 p/ m% M3 |# t7 V          mid_tread(i) = delta*inteval_tread - 0.4;            %mid_tread的方法: U6 V- N# ]2 r4 z
          end
& d% A- i" T* S; }          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
- U! z6 Z- ]0 ~! a3 `! s, I          grid;$ p4 I$ s3 T3 G6 v5 T! p
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
' w# O" J& [( I: {3 S          grid;1 E: @+ @# R/ o

; ^* i1 ]9 l4 p$ y5 p      $ w# g7 h1 v" z9 o0 |3 [. o& K* |8 w

! W) [+ M7 `% h8 K( B. d    参考函数:
/ |. g  {, `# r" V! J0 ~$ D* ]8 M. Y: F: S* U" a+ ]. N* e' M2 r
         wavread(wavread的具体使用,举例说明):
# v8 h3 l5 z* B/ L7 A, U9 _: x/ ]! _$ V
                 例子一:[Y,F,b]=wavread('test.wav');9 h2 b8 c) p5 ?( W2 t, d, {! X
                         Y2=Y(((F*10+1):F*20),:);
3 F) a% b& p4 f: w# ^& g                         wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,0 E7 e$ D& Q6 M7 T

; a/ ^' |: ?( {( t0 B: A                                                          %因为你要把绝对路径加进去
+ H" Q& L3 d1 D
' c, Q) Z: Z* }! M: D* n; M3 U                         %以上做的就是将这个音频的10~20秒给Y2。加入我们听到   
$ r! }, G" P5 J: G0 |! _  K
2 F! Z5 O2 d. y2 E# o                         %一首歌需要对其中某一部分进行操作,就可以这样做。- F% @8 {1 F4 g% R" f; w, z: U

) g: A) O& O. g# o- C% A                  例子二:[y,fs,nbits]= wavread(wavFile1);
& a9 H  \7 G/ B$ f  f) U. k& A- F- a0 y% b8 O
                          %y就是音频信号;! r1 X$ |% u% q  t

8 l8 V# w% q4 \  l. a                          %fs是采样频率,比如说16000就是每秒16000次;- ]1 ~- u9 c& ?4 b
# g2 a7 G6 `  N; p) Y3 K! _% G
                          %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精
/ _( }4 M: v( j4 |6 I% j" J  C7 ^* ^4 ~
                          wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点
6 z6 B" k8 E. c9 s                        
8 T/ \' r9 u1 S+ o- z5 j( J* r$ B# b3 y. m
                  例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
+ E. K8 I4 X" v6 P  V* w
! E1 |, j/ t# ?9 W* w. s, g                          默认是wav  
/ R8 }7 V5 [  ?5 H                      例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点( n, y7 j, @$ E+ U
! n$ p( ~! b' I7 G* x% K$ Q1 @
                  例子五:[...]=wavread(FILE,[N1 N2]) 返回每个声道的从N1~N2的样本点
  • TA的每日心情
    慵懒
    2020-6-13 15:46
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-9-11 16:55 | 只看该作者
    Matlab之声音处理:对wav音频信号量化
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-22 15:32 , Processed in 0.093750 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表