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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

, S, h: l! p) Y' N2 ^; Z& |对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。( t, Y: c1 _( k: J$ |4 V0 y* |$ g

* F) i8 V- y1 `量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
- M3 f/ P- U5 }# I4 P1 `6 O& ~* d
/ Y$ a  \  v  P2 T4 x% C现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用8 C0 S% Y6 B; y( O1 q0 b- e
$ T5 R' n8 V9 ^0 w8 C: W8 \8 f
step1:2 j) D; m  r) ~+ ^1 H7 z
8 P6 ]' Z! q# c+ a
我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。
/ B3 Z) N& t% t0 ?& t0 u+ i% N. p  h
, f: I# w7 ]/ C: mstep2:对采集到的信号进行量化。' j. E0 {8 ?2 D, s8 }

1 }; }( x! g$ e9 }  \/ M5 c   方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
  d' r( |1 R9 p0 P$ A4 ?( ?- P4 D1 y  f+ G7 r
      syms sample_point;
4 N, ^  }0 C7 ~+ X$ X          syms quantizion_bits;  `3 `% _( J  ?' y/ G
          sample_point = 200;
7 B: J0 I" w4 U3 S0 e0 O% G          quantizion_bits = 5;) F; U6 D- s- U7 A- z, ?5 J2 `
          [y,fs,nbits]= wavread('road.wav',sample_point);
% D/ a- p( c; g' }# O          sample = y(1:sample_point);
1 A+ n  I" d( I          n = 1:sample_point;6 L  k+ w/ N' ]3 ~6 x) I( w
          q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器
1 Q1 q+ e, H# |! M/ V/ V          q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器% @( `  A5 l% T* \; m: @, V4 h: E3 o
          mid_riser = quantize(q_riser,sample);%对采样信号进行量化
" e+ ]1 B2 r7 @# g          mid_tread = quantize(q_tread,sample);%对采样信号进行量化8 ^' x' r" {- _/ h6 e
          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
% T( x4 f* ~$ a% w( {0 [# ]% Y          grid;7 X& f5 X  I: G7 T* E! V( R
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');* W$ b: O+ ]- B. x' f
          grid;
1 K  o' z+ y/ F# m' C& D$ X4 T8 b
4 o7 Q% k4 e) f0 {, t   方法二:自己量化,更加灵活。3 E0 m! G* ~5 L# B) S$ o& l5 d
/ F7 E% B5 t9 d+ Z8 _  C; l6 }: \
      syms sample_point;4 E" x" I) w0 z% ^( j
          sample_point = 200;         %所需采集的声音样本点的数量
- X# Y( i6 Q( ~& l4 i; f0 p          [y,fs,nbits]= wavread('road.wav',sample_point);   %提取出音频信号的前200个点( L/ L8 E4 h8 Q
          sample = y(1:sample_point);   %提取出左声道的信号6 N) L3 K0 h0 ~. N
          n = 1:sample_point;         
8 h  u. P" P6 w6 I) R8 _& X& b          mid_riser = ones(sample_point,1);9 x7 c6 k. T, Q8 B+ _
          mid_tread = ones(sample_point,1);
8 n% a: u: i9 w5 C1 C          delta = 0.7/16;              %采样间隔
: j" w0 t6 U+ D9 ~9 m7 Y* n          for i = 1:sample_point         %采用mid-riser的方法3 k( c4 n6 a( w, o% l) L
          inteval_rise = floor((sample(i) + 0.4)/delta);  %计算有的采样间隔数; ]2 A7 v$ Z' o1 B
          inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
5 f8 m6 h6 y% G/ ^1 w# {. z          mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4;  %mid_riser的方法$ c5 F4 A  c+ R3 L$ X, c
          mid_tread(i) = delta*inteval_tread - 0.4;            %mid_tread的方法
/ p( E7 x) B$ `$ w& m% h          end3 o9 \8 e8 A7 U& r7 q
          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');) G3 a  I: S: q# y
          grid;
' D1 j& |8 M7 R# D& A1 Z/ w/ u          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
  Y, X$ _: _5 U          grid;
+ X, ^( r2 D4 `4 Z9 e8 F* I6 ]) f; y" g  V- N3 O- [1 A
      
" o" t( [/ G/ h( A9 {
/ v' V# ]& T+ V- x+ z* z/ G    参考函数:7 c/ m. ]9 d( y; i! {. b

/ Z3 X! W7 P: {) M) J         wavread(wavread的具体使用,举例说明):5 V+ R1 Q, h/ E0 f! d

: c* M  X( ~& }7 B4 E3 d                 例子一:[Y,F,b]=wavread('test.wav');
% k  {' i0 V  F. c! ~6 z                         Y2=Y(((F*10+1):F*20),:);% ~0 h) f! w0 t0 B- q$ \9 \; N
                         wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,) N6 t/ M0 p0 s
/ f" |4 Z% ^" c8 w
                                                          %因为你要把绝对路径加进去
4 C- _6 X- t3 X! B, e! R/ L$ T2 a
' S) S! W% c& R' v8 [  j                         %以上做的就是将这个音频的10~20秒给Y2。加入我们听到    % H! z6 I7 z8 q5 }6 Z; k# I

6 a, ~& Z+ `( w9 r! w% [                         %一首歌需要对其中某一部分进行操作,就可以这样做。' Z! ?6 N' n4 C% D0 Q

$ w4 [# _# ^1 {$ U9 X& Y8 |) J; v                  例子二:[y,fs,nbits]= wavread(wavFile1);
; E3 b' D3 B: ^0 l( P1 W
" y4 g$ i- w6 V  c" s9 m; B                          %y就是音频信号;0 `6 [5 d) g( n2 m) d% I
7 m0 y; z: K7 V/ B2 J2 T
                          %fs是采样频率,比如说16000就是每秒16000次;
) _& k) j) \6 X- B0 s# Q
( L/ c1 ^& H: G2 I                          %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精) D' i/ L+ d$ P( K& P, E
6 |( Y  O" o9 l2 p  E
                          wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点9 ?/ U: z( M6 G' E
                        9 i% t' @3 `$ f$ `3 J
0 M( |4 @0 n1 K# M' ]
                  例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,1 z6 J$ H& E. }- ]% B

5 K* P- F& r4 b3 r- k0 C" P                          默认是wav  ; B, N2 o3 V; i0 z+ Z% l
                      例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点
' u- B" n* Q/ v) c4 X$ ^+ C
6 ^! l, y$ }  C: D) e2 |                  例子五:[...]=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-8-16 14:42 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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