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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

( ?4 x; Z1 H% Y, {( H对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。
5 {  \% E2 A' \6 Y3 U5 B+ i1 Y4 h
量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。4 z; ~5 o1 ]# @4 }) z6 C! T

7 Y' Q2 g' b# U$ Q现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用3 H1 R* f4 f1 k* H- y
2 j; d  Y/ Y' a' Y" S
step1:( [6 r- x1 N' u0 C  x+ ~& h

9 q# \2 h) T8 E7 c我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。
0 [2 |7 Y; F3 x* }9 Y/ y2 e8 ~$ u) g2 D
step2:对采集到的信号进行量化。/ C% j% k" V: L/ _* i9 E5 w
. A1 e; z' f; V: \  f- u. ?
   方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
6 I% r' S" n% a# Z2 L9 p1 c
1 t5 L, q! k4 m* {7 c. S) n      syms sample_point;% R' o! D8 f0 ?
          syms quantizion_bits;
! S( H; F; s$ v2 ~. i. U  K          sample_point = 200;2 z4 v7 T6 P' ]+ O
          quantizion_bits = 5;
5 a: q* }' w4 |          [y,fs,nbits]= wavread('road.wav',sample_point);8 b. r- h1 B; M! w# v
          sample = y(1:sample_point);% l& O: i) U& H! _0 R5 v
          n = 1:sample_point;
: i2 x. @" S; a' @          q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器
0 f, a  K: `- D* L4 S* s, m- ~          q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器7 c* }0 [2 G0 g# X) t" X; e; A
          mid_riser = quantize(q_riser,sample);%对采样信号进行量化, Q' H- M, W! E( i6 P9 A' R
          mid_tread = quantize(q_tread,sample);%对采样信号进行量化6 }) h$ Y+ x- b
          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');  J; h# |7 X3 f, ~2 [7 z
          grid;
$ u* u  y/ V! P6 M          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
1 B8 }! g  ?7 y- g) {: R9 Q- Y2 t          grid;, n4 V3 e4 M) l2 q4 t; w) m

2 C. {9 |5 e* I% C1 z   方法二:自己量化,更加灵活。6 e/ \- ?1 P4 h' w
1 W: V$ V4 q- Q' k! L: A1 q( _
      syms sample_point;
. n, h# R  K7 X          sample_point = 200;         %所需采集的声音样本点的数量1 d$ Y- w9 a' z) e: n* v
          [y,fs,nbits]= wavread('road.wav',sample_point);   %提取出音频信号的前200个点& ~: O2 v" [" S
          sample = y(1:sample_point);   %提取出左声道的信号( ^& R! K) o0 \9 {
          n = 1:sample_point;          6 \/ f2 W: \& O1 G& r. Q& X6 b
          mid_riser = ones(sample_point,1);9 y$ Z/ ^' {' H2 U/ r1 I: n/ U- F
          mid_tread = ones(sample_point,1);2 H  L- |! a7 {9 ^1 f
          delta = 0.7/16;              %采样间隔7 N, l% t; ~) [" s4 q$ F4 u
          for i = 1:sample_point         %采用mid-riser的方法: X1 K, L1 t7 t1 u8 e" _6 C
          inteval_rise = floor((sample(i) + 0.4)/delta);  %计算有的采样间隔数& \. ?/ K; z! f* n
          inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
2 X/ g* J" e+ D& I& s) \6 Y          mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4;  %mid_riser的方法* ^9 t/ c8 c6 C& |1 c/ T7 b# S) p0 D  ]
          mid_tread(i) = delta*inteval_tread - 0.4;            %mid_tread的方法1 Z$ I& @! [- I1 v" U$ [: o
          end. W' X) A6 ]! b& \) K
          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
8 W+ V( s8 n! J0 Z# a7 I3 [          grid;
& \- ]: E, Z5 L          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');& m6 ?- H2 ~) ?, R4 U3 y
          grid;% Y* w% _6 f7 [6 ~  H

3 J0 c# G6 q  u2 Q( A- A2 f4 i      ) @( Q1 N- H  k, C2 T8 G' k

  D* A" I9 n4 L* ~, i1 w. W* |    参考函数:
) ~$ k- D; g1 O6 X+ A) `
9 \+ o3 {/ E1 R4 r         wavread(wavread的具体使用,举例说明):5 Q( O7 S, x. n) z% `( k* q
* c& t4 }0 T2 q  Y
                 例子一:[Y,F,b]=wavread('test.wav');
) n8 x9 P& Y! D+ r: }( M                         Y2=Y(((F*10+1):F*20),:);
# }/ M3 N1 L: N# s1 y% x" R                         wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,
! }* f4 {% `- l1 u
) A( Z9 G; \8 }  M                                                          %因为你要把绝对路径加进去3 h! X: d9 T1 o- r7 ~7 Y* ]
9 p" V& Q, f- B$ _) E) z: b# i
                         %以上做的就是将这个音频的10~20秒给Y2。加入我们听到    : i3 }# ]! x; s6 [& h, U5 G" J0 {

! H$ r) t/ G* f+ X" @3 C* Q* _                         %一首歌需要对其中某一部分进行操作,就可以这样做。
+ j- h- P' w. l! P" T0 x: C
! q8 V, Z5 F; q) B& r* S; Z& n                  例子二:[y,fs,nbits]= wavread(wavFile1);
5 d# {9 [# V2 n
4 p4 Q, W  U4 x/ X1 K8 P                          %y就是音频信号;
& `  \" z* K8 V6 W8 @/ T/ B
% W' h" U; O+ [                          %fs是采样频率,比如说16000就是每秒16000次;
% `  A- |8 e; Z( l
2 A! q- j& H) V$ V" I                          %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精0 I( k* ^2 A$ J! ^* ]

3 ^% H1 u$ {3 P/ a8 H7 B; A                          wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点# U: Y/ o$ q" a& N4 ?  b
                        # ]% n- T' \, T1 r/ v2 R
* ~/ f/ |+ Q; `' M
                  例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
; [, J4 N9 X+ ?! V  D
+ d- q/ i/ [- d2 y/ g) H2 V! T! k3 V                          默认是wav  
6 T1 n4 I+ _( c4 n                      例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点, s" s. R8 W: B  F! v
; w5 ~2 w7 b: `$ c3 {3 d3 L
                  例子五:[...]=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-6 15:50 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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