|
|
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的样本点 |
|