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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

# P+ r: u  k: |; {对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。
4 o+ q8 E1 k$ B  m
; o9 f0 U$ D1 P! u量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
1 L; E0 e1 g1 y9 i
, j# s" }3 K" D$ i: ^) Y; r现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用; H+ I9 T0 n+ x# w! {4 f6 z

) w- |+ u+ L2 H0 K* Astep1:
8 ~" Q0 C& q) n6 N
0 ~6 V/ m2 y$ I* ^, t我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。
0 U& v' E* P- S4 M( w' C) n; i# y' X% o: Y7 e4 M: h8 Q# {' ~
step2:对采集到的信号进行量化。! }, a4 O3 Q+ w6 O% k. w

& m" `0 z6 e3 E; T" }5 N. `   方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
0 T4 v3 `' n: Q. S" h, {1 |  M9 Y7 V4 X* W" f9 [* }
      syms sample_point;
! i/ ?0 G2 ~! t( K, |$ `% V2 P          syms quantizion_bits;4 d; f5 {$ t8 }% X
          sample_point = 200;8 r% D, \9 U. w9 V! L; f- ^
          quantizion_bits = 5;
, N3 }  n6 u0 z( d          [y,fs,nbits]= wavread('road.wav',sample_point);) Y% n5 d+ }" y- ?1 g) P
          sample = y(1:sample_point);
0 G* X. K" W4 t$ q$ q' z' P          n = 1:sample_point;& H9 _9 ?5 p, R  a
          q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器$ }" D: Y; |5 u7 p4 B7 `
          q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器9 T# s6 y+ y% g  l, b6 L2 ^
          mid_riser = quantize(q_riser,sample);%对采样信号进行量化
+ s7 f- w. I1 U# A! d& l5 p  `0 v          mid_tread = quantize(q_tread,sample);%对采样信号进行量化% v8 d$ B0 r& K
          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');2 O6 {1 ^4 t; o- w: S' _  R
          grid;/ Q) R# U. s; R
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
$ F' R5 D- a3 V2 L          grid;
9 y! b: g( s% X: t6 p# j! j) w( u
* j+ H7 v# |* `$ Q   方法二:自己量化,更加灵活。: M) c5 G# @9 Z0 H9 w/ u
# g9 d( \# Q, L* K3 V; {% F
      syms sample_point;% I& _8 w% s. T
          sample_point = 200;         %所需采集的声音样本点的数量" k$ f8 o9 O! q
          [y,fs,nbits]= wavread('road.wav',sample_point);   %提取出音频信号的前200个点2 v% \4 |% n) G" k* Y: j
          sample = y(1:sample_point);   %提取出左声道的信号
; U$ N. O, l# f4 U6 o" R          n = 1:sample_point;         
) Y) E9 R5 p) C' T          mid_riser = ones(sample_point,1);9 q6 A% d$ R6 q& @
          mid_tread = ones(sample_point,1);: T9 M( D% e/ p. K1 I
          delta = 0.7/16;              %采样间隔) g4 x! X9 J8 \( c! Q/ Z4 z, q
          for i = 1:sample_point         %采用mid-riser的方法* W: j. c' g5 W  _% J1 H) d5 G
          inteval_rise = floor((sample(i) + 0.4)/delta);  %计算有的采样间隔数
2 f4 `$ `& P( I" m$ V# h          inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
  L: K: C7 ]- i, B# N7 |          mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4;  %mid_riser的方法
3 ?* \, q' U" _6 r! i9 ]          mid_tread(i) = delta*inteval_tread - 0.4;            %mid_tread的方法
3 o8 ]) I! _9 h$ m8 k* r          end
' ]0 B8 n# m/ L; f* L: x          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');1 H- X; Z8 R5 J
          grid;7 n% x# p3 ~/ k5 ]0 H. z
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
* A/ v4 f' _* Z  I          grid;- ~9 s: X: r4 D; i
8 j6 T2 z) D# X0 e7 K$ d7 C0 d
      4 p6 m% G3 F, Q/ l% L

: K7 q" i' x  P) K" u; x    参考函数:& c$ o2 C) |. f

5 w' l1 s: n5 r3 T! N5 q% D* N4 m         wavread(wavread的具体使用,举例说明):3 p9 O& u) t9 F8 _( m4 r

8 n' d: x3 C" c+ M' k+ {: a$ z) \                 例子一:[Y,F,b]=wavread('test.wav');
! I# x/ `* M6 h7 P: Y+ A8 g                         Y2=Y(((F*10+1):F*20),:);
% A; J9 K& h' U# s                         wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,% g# C& h9 i) l! g# l
% G: O! C' }: f/ r9 ~
                                                          %因为你要把绝对路径加进去
$ c0 {. a$ r6 n$ a9 X: h& L  \2 X7 ?
                         %以上做的就是将这个音频的10~20秒给Y2。加入我们听到    % z% G" z: e) ]/ \) \9 t1 a' h
& P3 F7 h4 l  G3 L  z
                         %一首歌需要对其中某一部分进行操作,就可以这样做。; Z$ ?, c5 j8 g0 K- J! b$ G0 ^9 H- X
  n) v6 C) L5 n, C1 P
                  例子二:[y,fs,nbits]= wavread(wavFile1);
& K* z1 R0 F9 R, o% N9 G' A$ a4 S1 I- N  q+ K1 N
                          %y就是音频信号;
8 ~( ]3 h% [0 c$ x8 }9 z
- g4 U9 P# {0 c" g$ W                          %fs是采样频率,比如说16000就是每秒16000次;5 B  D9 G7 ]# J7 T/ E
. y& @3 E" N! P
                          %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精
! p  i( z% s7 T
  {3 l$ c+ G# W1 N                          wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点
' |/ }/ C! ~) Y# I+ ^                        , p% z- h1 ~# Z5 i, N

# `1 t" W9 @$ e: S  {# }8 o) B                  例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
& Q2 [: K- f- b" V& Q
. ~. \; f) ?- h; \9 w                          默认是wav  $ d3 F' [7 C2 y& H/ S% L
                      例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点' D4 f. p. a" F" l1 Z: m: K9 @
% t, @' |( c7 S
                  例子五:[...]=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-24 13:58 , Processed in 0.187500 second(s), 24 queries , Gzip On.

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

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

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