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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

: H6 S" H. T+ k$ G* K) J对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。, e* b% {( l2 l# c; x8 t7 j

4 f/ X5 m/ m5 P" G) x% g9 A; T1 t量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
- v" U# ~4 m. q1 \0 r9 Y7 Q9 O/ {4 ?2 Y1 ]
现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用- \) b, U9 R# N1 c

/ c$ x0 u' |- J7 k: d! Astep1:
3 \+ j) j3 \! ?$ U' ?, m! N$ a2 o3 s, k% [8 e  z$ N1 I
我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。4 A% }' _) [( j; U

1 p- n% J4 v, Nstep2:对采集到的信号进行量化。$ ~3 t0 R$ M2 g6 h/ M. E+ O

6 x, A1 |/ R! ^# w8 }; k# ~  X   方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
9 P+ l+ M. k: m! L8 x( |7 _/ `! w9 \+ }3 s" O' a' l5 {% t: Z
      syms sample_point;+ D; t+ Y. U4 q/ m$ k7 |: G7 c, X
          syms quantizion_bits;# L* R9 F( r9 ?4 m3 @  a1 H
          sample_point = 200;  p- I$ Z. I  Z7 U6 v) d0 [$ I
          quantizion_bits = 5;7 e+ ^8 b! ]' o7 J: i0 F; V; a
          [y,fs,nbits]= wavread('road.wav',sample_point);
) ]7 G# \  `# I, X, Z0 c- K          sample = y(1:sample_point);5 w& b( v% f3 W% z7 _- J9 N& G( W
          n = 1:sample_point;
% o  S4 @! N! V. |2 I9 _          q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器& b: ^* y$ p) O0 `2 Z
          q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器
, d. a( U# j" r6 `          mid_riser = quantize(q_riser,sample);%对采样信号进行量化9 k0 r, ^8 }; C1 d/ U: }$ ^
          mid_tread = quantize(q_tread,sample);%对采样信号进行量化
2 Y& h- V: i5 @5 x          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');6 ]  `* p9 u# T5 D) A7 m* i" h$ r
          grid;( w8 g7 F+ \& r" f0 i
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');: S: a7 j6 l) f% @" u3 R6 r" u
          grid;7 t) k9 d( Y( G& ^# R

7 N3 N: U+ |) u& ]' U   方法二:自己量化,更加灵活。( _. Q$ h* v9 O9 d. G/ H1 d
6 D  `" X/ q0 s: j0 U
      syms sample_point;
, ?; u( T  M# a# ^$ _9 q" K  U          sample_point = 200;         %所需采集的声音样本点的数量, ]& o# J- ^9 N0 ]/ `8 G) g
          [y,fs,nbits]= wavread('road.wav',sample_point);   %提取出音频信号的前200个点2 W% Y2 ?" ~2 s3 z0 K2 k5 G, {
          sample = y(1:sample_point);   %提取出左声道的信号
* T+ s0 b/ ^$ m          n = 1:sample_point;         
' T! I1 m+ q, g) Z( N          mid_riser = ones(sample_point,1);
5 f/ o- A3 r6 C$ y' L          mid_tread = ones(sample_point,1);
* j1 c1 Y; r/ n0 p. V8 r          delta = 0.7/16;              %采样间隔
( g9 f" \/ P6 R) z/ `          for i = 1:sample_point         %采用mid-riser的方法& m! r! Q9 Q4 n9 B2 t
          inteval_rise = floor((sample(i) + 0.4)/delta);  %计算有的采样间隔数
( q% e9 g5 U7 M" s) w: k7 S          inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
& X: j/ s$ u" D2 _4 ^          mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4;  %mid_riser的方法
  N3 _$ `# T5 R! q  A) ]% B          mid_tread(i) = delta*inteval_tread - 0.4;            %mid_tread的方法
2 m& f4 |; G/ z' ]/ U4 m8 p$ c          end5 T) v* W! A2 m* G; I* p: x; m
          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');$ l- S. Q3 t4 e- x9 S
          grid;
# u# `& W% {: w, P% U. a; Y9 \          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
/ C2 Y+ |6 G4 D" h3 k$ h8 j$ E          grid;' Z& q: d- Q0 ?8 {3 W$ C! \$ N. ^
: k% \) C1 T/ ^% V* K- v7 e% Q
      
% e% B9 H3 M: z) A8 Z2 k7 T2 T" U
8 e& K4 I8 `: |; T5 ]: J    参考函数:5 p6 ?" p3 s5 H  C  k9 ~
& G& A" j1 w; f! {5 x
         wavread(wavread的具体使用,举例说明):
. j7 d% q- ~  p6 e1 k* g- F. l! b# t+ @
                 例子一:[Y,F,b]=wavread('test.wav');
- e3 d0 U7 T0 t: P* N( r                         Y2=Y(((F*10+1):F*20),:);# G$ r: e. h2 T0 \! e0 t" O9 h
                         wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,# j% d  Q. u- U4 B. S
$ S$ B$ F8 Y  \- a
                                                          %因为你要把绝对路径加进去
- A2 y, @5 \: Q) N1 I  A5 Y0 ?: R2 O1 \8 j. t# x
                         %以上做的就是将这个音频的10~20秒给Y2。加入我们听到   
7 z; V2 d. a5 M% N6 m* G
1 n5 w6 I1 e) L8 A4 S0 C( g& |                         %一首歌需要对其中某一部分进行操作,就可以这样做。7 v3 N! I# W! z1 X! [; S! n$ ?

' x( D" B: s/ j0 n& q                  例子二:[y,fs,nbits]= wavread(wavFile1);# o8 q+ e, r- x& J) o1 C; d; Z
! {& }$ d0 C& `/ t1 d/ Y
                          %y就是音频信号;; `, M0 ]' l& @/ W9 g  j
2 B5 E& ]; U' L* E/ Z
                          %fs是采样频率,比如说16000就是每秒16000次;! W/ V7 ]% X3 n/ `' x8 k9 b+ G

, Z' G) C6 R3 ?' I$ i                          %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精; W: M4 c9 P  j
7 _( c% A! I& y5 y0 {* Q
                          wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点
8 U+ ^! Y2 x' Y6 a' i# a9 ^- ?, ~                        1 g/ h# t  Q: i9 G
4 A% Z# I3 K4 H4 A9 G* v1 b
                  例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
( P; G6 R: r8 }# ]% A# Z: G8 N2 U- A& D5 f2 a: L$ n' m
                          默认是wav  7 v* A) L; V: m$ _9 G8 t: E( }
                      例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点
, c1 c- W' N7 ?. `9 {9 J
( V$ R+ s+ C; q! g/ v# x7 @1 F+ w                  例子五:[...]=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-25 04:49 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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