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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
% n- M* F( P' t- B
对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。
! y, g! N# Y4 J3 y4 x
5 S7 X: K0 d, H! `$ X+ _量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
, p# y* Q- B8 s7 `6 M4 {3 V* [
( o2 z* {$ u4 \$ n5 J3 E' S现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用
( Q+ |' S. ]9 M9 `5 c+ u& L2 r0 I- L- D0 g# }8 O
step1:
4 `! ~) b  H* E1 n5 f) U% S) G1 _2 T5 F# s( j0 M- E2 t3 c
我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。
* L$ J4 z# F2 m) V: I
' T4 l& I  k: J1 H5 W. ostep2:对采集到的信号进行量化。
/ i! Q5 h% W( u& A+ h! W" ~% L1 s$ R9 E" c
   方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
" `' H+ j" e5 j
' y- ~- u' e" W9 _9 E/ Z( u+ f      syms sample_point;
. |# I( e! y* @  Z. ^          syms quantizion_bits;5 k' T1 J  L; X$ p0 `
          sample_point = 200;
: Y# z- {) b7 w( x4 N, J" B          quantizion_bits = 5;: B( {+ \) v( D
          [y,fs,nbits]= wavread('road.wav',sample_point);
; X* L4 d( T5 L( `/ N8 J2 R          sample = y(1:sample_point);! u5 a, w+ T- b% i5 X
          n = 1:sample_point;, I3 @7 J& @* ~" f( l! D4 E7 ^
          q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器1 f; @+ `. \+ d  r. t: O7 e. H
          q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器# N/ E: I" R; j7 Y2 x5 Q
          mid_riser = quantize(q_riser,sample);%对采样信号进行量化4 o3 T  d0 G8 R$ g# }' h' W! H
          mid_tread = quantize(q_tread,sample);%对采样信号进行量化4 Q& p  O3 L( m" y, z6 W
          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
& z) b3 m; T- Y& ^3 }& E          grid;5 r. ~" x6 S5 O% d) C, w  ^
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
  ~- x1 E. P$ E7 C: L% s1 [          grid;
7 l: U( x8 C9 {, ]7 ?
7 u/ S1 E( p  R; y& U. [   方法二:自己量化,更加灵活。% H' `+ l  W& {- {8 z9 C) s0 S

. U& ?' N8 ]6 J& l7 R( W( c      syms sample_point;
* _( ]  ~( q, \, T6 ^2 @          sample_point = 200;         %所需采集的声音样本点的数量* S. E  q, S5 }& w
          [y,fs,nbits]= wavread('road.wav',sample_point);   %提取出音频信号的前200个点
, c+ s8 f: v+ P7 i# c5 n( M          sample = y(1:sample_point);   %提取出左声道的信号1 N6 Q; B1 J- |
          n = 1:sample_point;         
9 u. I, X3 q6 i" ^7 K4 o' C          mid_riser = ones(sample_point,1);# l& X7 g( t) e; V9 d  x
          mid_tread = ones(sample_point,1);
' A7 K3 ]/ x4 Z/ P          delta = 0.7/16;              %采样间隔1 A7 {4 E9 Z4 @, g, {1 B4 o2 X( T
          for i = 1:sample_point         %采用mid-riser的方法
  q- K/ T- F& `/ G2 r# L: j) L          inteval_rise = floor((sample(i) + 0.4)/delta);  %计算有的采样间隔数2 d9 E' ]) P/ Z! `. b$ X! G
          inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
6 q: n3 M6 M& d) ~6 B$ h          mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4;  %mid_riser的方法  b. t2 d* a. F2 R" N7 g5 o/ Z
          mid_tread(i) = delta*inteval_tread - 0.4;            %mid_tread的方法. c4 ^+ ^& p' k4 `: ~- v* u. P, @
          end
( @+ W$ l0 I7 Y% f" p          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
6 J9 O! P, H8 ]" H0 V4 j3 e          grid;
: l" B, N3 I& m2 Z          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');& L" h+ R4 J# t+ t% X  a9 }" {
          grid;
' }6 I/ x2 `$ x2 t- w& }1 k4 h
7 e! E6 \# h( |4 I. K' M1 \      ; j+ L: O% y$ z2 Z
% s$ v( P. O% O' u" H8 o& V8 F
    参考函数:
  l# T1 A9 W; e; z$ T5 l( I: s) L9 ^* ?# o; \2 W
         wavread(wavread的具体使用,举例说明):
1 x' N* q1 R/ `, ~( i# |- c! E6 G4 Y
                 例子一:[Y,F,b]=wavread('test.wav');" C) Z$ d, I8 Q* @5 [+ o; h6 m0 a
                         Y2=Y(((F*10+1):F*20),:);7 O6 S7 A4 H4 _* k* z# E% K; X) R
                         wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,6 L: D% ~* E% w+ O6 t
% z( @, K( j% |6 L
                                                          %因为你要把绝对路径加进去: ^. A  [& F% t! G' y9 S
; z! v3 P, ^, L9 t' V5 I
                         %以上做的就是将这个音频的10~20秒给Y2。加入我们听到    9 S: f' C' E% T+ e: \1 z

# j( g, \8 M3 L6 [" O  @                         %一首歌需要对其中某一部分进行操作,就可以这样做。+ ~5 l: ^, ?$ y& ]; c% J4 `
, u/ Y* N3 n1 O
                  例子二:[y,fs,nbits]= wavread(wavFile1);* J" j$ Q9 C. X- r4 k: m
; G2 J/ H# A. @4 F
                          %y就是音频信号;" M& f- A1 y& s; y' J; b: ~
8 j0 R( N. K( C( e7 f
                          %fs是采样频率,比如说16000就是每秒16000次;1 I6 Z0 I4 U4 z

+ `1 P# X* q' N+ L9 i2 W8 N                          %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精
1 J6 D0 L; H% r
9 G/ N- ~5 h0 S- p4 A                          wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点$ Z* ~7 h8 `' R& P5 l$ a
                        
$ X' X* b5 V' a/ ~! f2 t5 t5 e# S6 p
                  例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
) k) a% N/ ?4 u3 W5 r% H/ S% Y& \" @9 h. Q) S
                          默认是wav  5 n, x5 }' s/ n; ~0 l
                      例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点* `/ V3 q3 C* [
& R5 X6 Y7 T$ r- [- `! w0 v9 u
                  例子五:[...]=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-7-27 14:08 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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