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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
% v+ [2 @6 U& g
对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。: b5 Q1 K: J7 E8 K

4 _& K' k/ Q) ~量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
# }# O  G- D! k  Q5 T
( E6 P7 Q" R  Z  L6 o# w4 j现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用
+ C4 l/ q2 r! |8 Z, v( R. K5 J# _& V6 q1 h$ T
step1:
" N" w# |9 v: E' G7 j; L& m# `3 n' |
我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。7 L, j1 r# _( E  j
. q; ?: E. V2 J" b" g9 q+ Z5 j
step2:对采集到的信号进行量化。
# x$ _! c& P. L, P' L, q4 i" p
1 ^  P5 n4 w& T, Y0 B. j" n   方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)% }1 R& a) g4 `

/ K! C8 D+ z7 F$ q0 O  f' r! Y6 I      syms sample_point;; F& M: f2 ]( F1 O
          syms quantizion_bits;9 h  q" n, _7 ]" o) [! |7 P+ O! v
          sample_point = 200;
, i. R+ E; s/ p. q+ W; {- H          quantizion_bits = 5;; H. m) d) [/ g' d) S8 I
          [y,fs,nbits]= wavread('road.wav',sample_point);
. T/ V  v- l' J$ S0 Z          sample = y(1:sample_point);
- a# J  w4 S2 B4 }7 @; |8 @' ]          n = 1:sample_point;; w9 g6 Z# q4 @- S3 E4 H
          q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器. C. z4 f. d. H. \2 l* k
          q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器
5 R5 Y9 ~4 C5 z& a. f; K          mid_riser = quantize(q_riser,sample);%对采样信号进行量化
8 l$ o+ d& w- x5 X7 e          mid_tread = quantize(q_tread,sample);%对采样信号进行量化, R/ I" t' n. |" K% U
          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');+ M$ H# ^: {0 p( V- T
          grid;
6 c* z; T: {/ V- _( M+ X          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
" b1 ^9 W5 d( l2 B" p: C          grid;
& z& m2 Y# B2 i# |6 |# `$ w; ], `, w4 O
   方法二:自己量化,更加灵活。
6 H, J5 ~; N4 p' E$ Y& g) f- f" K
      syms sample_point;
7 r8 r: }+ u  N          sample_point = 200;         %所需采集的声音样本点的数量
  p/ R; n4 Y+ r/ d4 M          [y,fs,nbits]= wavread('road.wav',sample_point);   %提取出音频信号的前200个点( U: F6 \9 _0 D: j6 a
          sample = y(1:sample_point);   %提取出左声道的信号
1 v1 A" C% R  b1 b# n* w          n = 1:sample_point;         
- X, R- h" s* w( N; Y4 E          mid_riser = ones(sample_point,1);
3 e8 v% _9 R6 t          mid_tread = ones(sample_point,1);5 l( V, c1 }* k- t! X6 L
          delta = 0.7/16;              %采样间隔
0 P  k) U8 R  i8 w          for i = 1:sample_point         %采用mid-riser的方法
8 x& M# M" y% T$ ]9 B: Z          inteval_rise = floor((sample(i) + 0.4)/delta);  %计算有的采样间隔数) A" n8 [5 ~& J( O$ Q% X
          inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
" e# a# y6 F9 ~; A" _2 v& S( |          mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4;  %mid_riser的方法7 t0 t( j4 ~) P. ~$ ^7 g& I& S3 k
          mid_tread(i) = delta*inteval_tread - 0.4;            %mid_tread的方法
) n8 S) e2 D4 b          end
* s( s8 k( k# K5 |) C          subplot(1,2,1);  plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
" W& u& l$ W, I3 B+ f6 {& D          grid;4 d* r* j9 K7 N! s6 N: X
          subplot(1,2,2);  plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
+ V% x7 m5 K- y0 G9 N! v$ K1 v9 I. Z          grid;
8 t, N7 T$ R1 u9 h1 d( W8 X  m4 [! F# L  g
      ( G. W2 }  l% z, W. p' l0 r  @
+ [& G" e3 d1 r1 [$ C5 G% D4 c5 F
    参考函数:
) I: y: [1 m6 o  L7 P8 L* s1 P0 {  i" l
         wavread(wavread的具体使用,举例说明):
2 ?0 T- ^9 }% z7 `4 H' E' n3 @  v" O, T4 s+ V9 {9 q, e1 \- M8 T
                 例子一:[Y,F,b]=wavread('test.wav');
; H7 n8 ~/ B; F1 C( m: s4 a% K' l% |+ W- _                         Y2=Y(((F*10+1):F*20),:);
4 R8 Q! r8 R: M0 ^; A4 o; G                         wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,
& l9 {0 R# }5 b
& d' y' Y* F$ N: Z! I                                                          %因为你要把绝对路径加进去
$ ^& v8 P& s% r, I  q9 X
6 J2 d/ V- H# [% B# q$ ]. T. o                         %以上做的就是将这个音频的10~20秒给Y2。加入我们听到    # ~- x$ e" l" @4 C$ ^: V) b& h
# j! ]3 _/ [; s3 r
                         %一首歌需要对其中某一部分进行操作,就可以这样做。9 y7 i5 i+ x$ m9 @5 a7 [
. W' M" R" Y5 e. d) X! {+ Y
                  例子二:[y,fs,nbits]= wavread(wavFile1);# c# _6 f, k2 `) h* i' N' c; ]2 s

" }( Q6 d: j" o) {# l                          %y就是音频信号;
, I1 B; {- I+ K& l2 |/ ^' c# `: n. Z3 g) h! M. m. o
                          %fs是采样频率,比如说16000就是每秒16000次;" F5 |6 o; @( |  a& @) K
" j+ u& O' w0 S9 C( h7 y6 @; V8 t
                          %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精3 z! U: @9 g* X" g9 q( e8 Z
% T7 \4 }: m  i1 _! ]6 r4 _
                          wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点
9 ~' x  n$ c* v' I9 N4 ?1 B                        
$ u& E7 B+ M2 [6 e9 @
( e1 l  [, }2 P& b5 @                  例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
2 ], C. o: i! E- ~0 y* w8 v
, @% P. W9 n6 e0 W                          默认是wav  - Y1 s. r( f4 M# k$ f
                      例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点5 ?6 ~! t5 U! Z% n+ P

. t* ]5 [: G# e! n9 m( h                  例子五:[...]=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:00 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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