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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
1 ~' {  l. [" U
对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。# w: n; m; y4 N% N( Z5 o
' f, u2 ~8 j0 r' v7 ?0 ?& @
量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
% {' [, a0 N& @( t9 f
# d. C  u- S; E3 W6 T8 c现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用
% k! L& U2 |( G
) H' f/ m: f. k4 y4 S+ d7 Sstep1:& v3 E" F9 v+ ]% Q( B  D

4 L, j; U1 \, ~5 t  x" Z我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。
0 R+ B6 v6 K& t: F* }8 o
2 G/ V. ]( J! A  a2 I! a8 ^; Ostep2:对采集到的信号进行量化。
1 y" T8 \& c  U' Z5 Q( V7 w' W9 B2 O" `" g
   方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
( q" r* f' T9 b% M1 t. \0 h( C
2 m2 L( H% r9 O6 u. p/ F      syms sample_point;0 T' {3 W1 b* `$ V6 W
          syms quantizion_bits;
3 s/ `8 V, h( k7 I2 w, D          sample_point = 200;
/ l7 I$ q. C, p+ D: P- l& y6 q          quantizion_bits = 5;7 T- a( ]! b+ n5 |5 q+ N' u1 n9 F
          [y,fs,nbits]= wavread('road.wav',sample_point);
: J5 M6 b$ [0 K  m; U# ~          sample = y(1:sample_point);$ R  z# g% ^6 v
          n = 1:sample_point;
3 \/ V. a4 }& V- T5 ~  H( {0 a: z4 x          q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器
: z) n4 W/ U3 J$ n7 J$ t          q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器$ Q8 j+ ], `- H3 o1 H
          mid_riser = quantize(q_riser,sample);%对采样信号进行量化# N; P4 d! B- o, i
          mid_tread = quantize(q_tread,sample);%对采样信号进行量化
  L7 N6 G. ], V! x3 ~; G5 q! |% `          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
7 J3 d( o: i+ j          grid;3 L5 t  F9 U) [# h# L* u
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
+ {7 v4 ^% }$ p3 E! [          grid;9 y0 M# K; G4 J8 v

9 L5 `; {6 j+ `+ |   方法二:自己量化,更加灵活。
5 f: U9 o' A. I2 O/ H3 W4 G3 t9 Y* X% ^" E7 U
      syms sample_point;" ^0 Y) Q0 P1 x: @3 t' k+ n& H
          sample_point = 200;         %所需采集的声音样本点的数量
- d0 r: l/ a1 q, N  H          [y,fs,nbits]= wavread('road.wav',sample_point);   %提取出音频信号的前200个点
* R/ O, g( Z. {/ t' g0 h9 t3 b" D          sample = y(1:sample_point);   %提取出左声道的信号
+ ?+ \; A+ o. V( V- P3 |% k" T* A: p          n = 1:sample_point;          . S: M& \& s. i) \! u$ k5 }9 n
          mid_riser = ones(sample_point,1);1 U9 @2 H' @" D, N; Y- I
          mid_tread = ones(sample_point,1);
; N; C$ T# C0 L; l          delta = 0.7/16;              %采样间隔2 k' U' A/ F2 d" A# P
          for i = 1:sample_point         %采用mid-riser的方法
/ \" x4 e" ~, H7 s4 L. T8 R          inteval_rise = floor((sample(i) + 0.4)/delta);  %计算有的采样间隔数- ^+ {/ _; o( o7 y& Z) I
          inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
" `/ Y! y. C: h& ?2 Q          mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4;  %mid_riser的方法
# O* s: j0 R2 p8 }$ q' f4 X          mid_tread(i) = delta*inteval_tread - 0.4;            %mid_tread的方法" B4 A0 S- g% s; o6 p  k
          end
% \8 `- B( E  |2 G: v2 v( f) c          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');  ?! Q9 x; Z" ~5 @+ p
          grid;  o4 U0 `! O0 }/ P% \0 A6 j" \
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
- ^6 r5 @  F: V/ s, N          grid;
* @6 `2 k' K4 j* K5 I( r* C
: b. F/ b2 |. o) l. p. H: R+ A      
- G/ q4 ]4 z/ A) n: p' S7 y( O- F
0 Z  v' L( R% k6 _0 _3 E    参考函数:
9 Y5 X6 ~! r6 ]5 u% u9 b0 v- t: y+ b) A9 I8 t
         wavread(wavread的具体使用,举例说明):
' i4 }6 _8 ?" v7 Z( k9 L( p2 B/ _/ Z9 I1 p9 }1 f6 p
                 例子一:[Y,F,b]=wavread('test.wav');! j( ]4 q6 X/ y) |% h+ Z. u
                         Y2=Y(((F*10+1):F*20),:);8 B4 ]: U8 \% S. W! Y( C+ i
                         wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,# J" W& g8 N' o  u
2 c2 C- W& C: s4 d& S& f; S
                                                          %因为你要把绝对路径加进去4 a/ O0 z5 Z6 }6 C3 U( s

3 V) Q& X4 O( w; Q3 D                         %以上做的就是将这个音频的10~20秒给Y2。加入我们听到   
  d3 N0 _& k% E- f" ?/ Q2 ~% \, i
8 E- l0 R& Z0 Z! _1 ~                         %一首歌需要对其中某一部分进行操作,就可以这样做。, z4 F& C" a  |

+ Q+ D$ c% @# b7 G& d7 c                  例子二:[y,fs,nbits]= wavread(wavFile1);1 Z6 d' e4 v: ]( {% Z6 V* a* b: _
: K4 D' t+ e) m; ^4 r3 q
                          %y就是音频信号;
, H7 A3 u; h4 U6 M( d7 q/ H: e( D% J5 |, I) c
                          %fs是采样频率,比如说16000就是每秒16000次;- E/ F7 C3 e5 h$ a8 J
% [3 [4 W, o* P: H8 P" G
                          %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精
$ i( c  l1 _2 i" H
5 z) m' X: H) R9 y                          wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点/ N1 I$ G- f0 C  E7 P" y4 A" J( l
                        % L0 U6 t8 i, M* l2 d1 _

! s" K7 b' f2 s" A                  例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
% j0 K# W$ h  u8 h* x
; F5 A5 S  [; R8 E$ z8 T5 x                          默认是wav  
4 _& t6 E# V0 ~; x; d8 F( i                      例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点
" Q  p0 J5 `$ X9 D$ Z1 v6 j$ s7 a' Y& ^7 v; g* 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-11-4 05:02 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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