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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

. v+ T6 D2 d2 ~& u" N9 a- Z对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。
, i( e5 Q% U5 x5 h- t- R
: O& @9 }- j# E7 J8 `1 n! `量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
) \8 N: Y, Y! e3 L( R% y- m; s$ n- N& p! z
现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用
5 o1 `! \& a: `6 M. n4 |- M6 k5 C& X3 B) x8 i" L8 S
step1:
5 {0 C* N: k: _8 Q
4 I" m( M9 \9 M+ ~8 C2 U我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。! ^- \3 d- k1 G* t% I: y' w

# `" t. E+ y3 `4 ^% T' Kstep2:对采集到的信号进行量化。
; |% J% G6 j' F+ @5 W3 N3 S. Q" u' z9 O
   方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
, e9 \4 L) O" {" G( [1 i
9 N5 h. A2 D, C; w; v/ }  a      syms sample_point;/ m' g0 O4 [& H, g0 M
          syms quantizion_bits;6 k( ?. T; W# t- _
          sample_point = 200;
1 z4 u% E% g& X7 }) d6 Y          quantizion_bits = 5;0 N' V5 E: n3 ?$ c
          [y,fs,nbits]= wavread('road.wav',sample_point);
: ^+ ]9 ^8 x2 t  g          sample = y(1:sample_point);9 H0 c9 L* W* n$ d, }9 ]% l+ u9 b
          n = 1:sample_point;
. |$ `0 j+ O) I3 U          q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器
, I1 c! W9 [6 v6 J$ _          q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器
* C* k6 n/ L# ^- O          mid_riser = quantize(q_riser,sample);%对采样信号进行量化1 X1 z) z* }7 t* j  p* o$ j. Q) n
          mid_tread = quantize(q_tread,sample);%对采样信号进行量化
( }0 D1 }# ]. K0 `1 {8 p# P          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');, {' I+ d- P9 J! m! N4 ]- j
          grid;" r$ B  ~! \. t0 z
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
4 T0 A& W3 x$ m7 D. Q1 ?          grid;
  M# [: |6 L) |" j; N5 a
. t8 n  S9 l. n7 A0 G' g   方法二:自己量化,更加灵活。3 X% F% R) w2 h( B. w

- y2 I" o0 |1 t      syms sample_point;
) w" s7 Z) Z( ?          sample_point = 200;         %所需采集的声音样本点的数量$ s8 o: q& }* k' w; [
          [y,fs,nbits]= wavread('road.wav',sample_point);   %提取出音频信号的前200个点" y5 i0 ?; Z. T9 Q
          sample = y(1:sample_point);   %提取出左声道的信号- H9 L' g5 v# L6 a  Y9 d- [* w
          n = 1:sample_point;         
- V1 v5 U6 b( y          mid_riser = ones(sample_point,1);
0 S5 z6 H5 Y5 |2 |6 v& M          mid_tread = ones(sample_point,1);; [& d% I& R4 W4 m7 O4 ^" U  i# K
          delta = 0.7/16;              %采样间隔
' ]- R, j: {4 d: r4 y& p1 m          for i = 1:sample_point         %采用mid-riser的方法
8 U, g/ {) E" e$ p          inteval_rise = floor((sample(i) + 0.4)/delta);  %计算有的采样间隔数
3 n/ Z0 a- I" G: A# L- [5 p9 {          inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
$ H: R6 N! T) M; T7 v5 B          mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4;  %mid_riser的方法: N. z* u3 ?. s  b
          mid_tread(i) = delta*inteval_tread - 0.4;            %mid_tread的方法2 ^. O4 _* \+ ~: P' x6 w, d
          end
& q7 h: c& e9 L" G          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
# o8 z6 K7 d6 A0 x          grid;. ~7 F! i; @6 H. [  K
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');1 O9 e# B7 G3 S  V
          grid;
* c4 e/ K7 o# ?% N: P% y
) g8 q% H  a2 ^4 e, R      * Y0 m( `. u- N0 I
# D8 w# x! `, j" q
    参考函数:
4 I$ `# N) P2 s6 p4 }& j1 J. o# D) ~# r1 z6 Y! q# I  R! i: c
         wavread(wavread的具体使用,举例说明):
/ e4 W: o2 p4 F+ [8 ^1 X1 u( R, E
                 例子一:[Y,F,b]=wavread('test.wav');
2 ?7 r6 F9 D- K2 x                         Y2=Y(((F*10+1):F*20),:);! r& g' I( k. |' g5 H
                         wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,
) r, ?( Q& L! |8 J. x* L# s5 R# S# O" I/ o, T" d
                                                          %因为你要把绝对路径加进去1 e, H1 f9 t3 u

, _5 ^# D$ w, @# w" R, {* B                         %以上做的就是将这个音频的10~20秒给Y2。加入我们听到    7 S  p7 @' x, C. P5 s; t
# s4 A0 Q& x2 @
                         %一首歌需要对其中某一部分进行操作,就可以这样做。
5 L4 M5 O  D3 c6 ]
, t# C4 m( Q* T8 C                  例子二:[y,fs,nbits]= wavread(wavFile1);
# e7 g9 D/ q# \3 n3 Z: w
. k$ c% e& K7 Z4 g6 }& F                          %y就是音频信号;: c/ i0 w6 ?6 X" g, ^4 |
! o+ ?6 J" O) ]# W+ s
                          %fs是采样频率,比如说16000就是每秒16000次;& G( F' x( e& R

" x; e, K0 ^/ H" f- z' a" R                          %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精
' b8 H/ x0 t% r6 J' q+ x. H1 V$ t
" _  a, X& F1 V- B2 H- ^                          wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点
4 C/ f' ]0 F+ L2 b1 u7 G                        5 o6 _( b, n; N. o& E& b! \

4 U; j0 {) G" \: a                  例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
  N( M. u+ ]# V5 V2 }6 X, M$ b
. N: d" ^' t) T' j% x: M/ ?                          默认是wav  
, }/ d8 m% s( v' l' C# {                      例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点
. ]. Y( w, h0 q- ~) W) {: Q. [0 F/ J. I
                  例子五:[...]=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 12:24 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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