|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
% n- M* F( P' t- B
对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。
! y, g! N# Y4 J3 y4 x
5 S7 X: K0 d, H! `$ X+ _量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
, p# y* Q- B8 s7 `6 M4 {3 V* [
( o2 z* {$ u4 \$ n5 J3 E' S现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用
( Q+ |' S. ]9 M9 `5 c+ u& L2 r0 I- L- D0 g# }8 O
step1:
4 `! ~) b H* E1 n5 f) U% S) G1 _2 T5 F# s( j0 M- E2 t3 c
我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。
* L$ J4 z# F2 m) V: I
' T4 l& I k: J1 H5 W. ostep2:对采集到的信号进行量化。
/ i! Q5 h% W( u& A+ h! W" ~% L1 s$ R9 E" c
方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
" `' H+ j" e5 j
' y- ~- u' e" W9 _9 E/ Z( u+ f syms sample_point;
. |# I( e! y* @ Z. ^ syms quantizion_bits;5 k' T1 J L; X$ p0 `
sample_point = 200;
: Y# z- {) b7 w( x4 N, J" B quantizion_bits = 5;: B( {+ \) v( D
[y,fs,nbits]= wavread('road.wav',sample_point);
; X* L4 d( T5 L( `/ N8 J2 R sample = y(1:sample_point);! u5 a, w+ T- b% i5 X
n = 1:sample_point;, I3 @7 J& @* ~" f( l! D4 E7 ^
q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器1 f; @+ `. \+ d r. t: O7 e. H
q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器# N/ E: I" R; j7 Y2 x5 Q
mid_riser = quantize(q_riser,sample);%对采样信号进行量化4 o3 T d0 G8 R$ g# }' h' W! H
mid_tread = quantize(q_tread,sample);%对采样信号进行量化4 Q& p O3 L( m" y, z6 W
subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
& z) b3 m; T- Y& ^3 }& E grid;5 r. ~" x6 S5 O% d) C, w ^
subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
~- x1 E. P$ E7 C: L% s1 [ grid;
7 l: U( x8 C9 {, ]7 ?
7 u/ S1 E( p R; y& U. [ 方法二:自己量化,更加灵活。% H' `+ l W& {- {8 z9 C) s0 S
. U& ?' N8 ]6 J& l7 R( W( c syms sample_point;
* _( ] ~( q, \, T6 ^2 @ sample_point = 200; %所需采集的声音样本点的数量* S. E q, S5 }& w
[y,fs,nbits]= wavread('road.wav',sample_point); %提取出音频信号的前200个点
, c+ s8 f: v+ P7 i# c5 n( M sample = y(1:sample_point); %提取出左声道的信号1 N6 Q; B1 J- |
n = 1:sample_point;
9 u. I, X3 q6 i" ^7 K4 o' C mid_riser = ones(sample_point,1);# l& X7 g( t) e; V9 d x
mid_tread = ones(sample_point,1);
' A7 K3 ]/ x4 Z/ P delta = 0.7/16; %采样间隔1 A7 {4 E9 Z4 @, g, {1 B4 o2 X( T
for i = 1:sample_point %采用mid-riser的方法
q- K/ T- F& `/ G2 r# L: j) L inteval_rise = floor((sample(i) + 0.4)/delta); %计算有的采样间隔数2 d9 E' ]) P/ Z! `. b$ X! G
inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
6 q: n3 M6 M& d) ~6 B$ h mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4; %mid_riser的方法 b. t2 d* a. F2 R" N7 g5 o/ Z
mid_tread(i) = delta*inteval_tread - 0.4; %mid_tread的方法. c4 ^+ ^& p' k4 `: ~- v* u. P, @
end
( @+ W$ l0 I7 Y% f" p subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
6 J9 O! P, H8 ]" H0 V4 j3 e grid;
: l" B, N3 I& m2 Z subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');& L" h+ R4 J# t+ t% X a9 }" {
grid;
' }6 I/ x2 `$ x2 t- w& }1 k4 h
7 e! E6 \# h( |4 I. K' M1 \ ; j+ L: O% y$ z2 Z
% s$ v( P. O% O' u" H8 o& V8 F
参考函数:
l# T1 A9 W; e; z$ T5 l( I: s) L9 ^* ?# o; \2 W
wavread(wavread的具体使用,举例说明):
1 x' N* q1 R/ `, ~( i# |- c! E6 G4 Y
例子一:[Y,F,b]=wavread('test.wav');" C) Z$ d, I8 Q* @5 [+ o; h6 m0 a
Y2=Y(((F*10+1):F*20),:);7 O6 S7 A4 H4 _* k* z# E% K; X) R
wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,6 L: D% ~* E% w+ O6 t
% z( @, K( j% |6 L
%因为你要把绝对路径加进去: ^. A [& F% t! G' y9 S
; z! v3 P, ^, L9 t' V5 I
%以上做的就是将这个音频的10~20秒给Y2。加入我们听到 9 S: f' C' E% T+ e: \1 z
# j( g, \8 M3 L6 [" O @ %一首歌需要对其中某一部分进行操作,就可以这样做。+ ~5 l: ^, ?$ y& ]; c% J4 `
, u/ Y* N3 n1 O
例子二:[y,fs,nbits]= wavread(wavFile1);* J" j$ Q9 C. X- r4 k: m
; G2 J/ H# A. @4 F
%y就是音频信号;" M& f- A1 y& s; y' J; b: ~
8 j0 R( N. K( C( e7 f
%fs是采样频率,比如说16000就是每秒16000次;1 I6 Z0 I4 U4 z
+ `1 P# X* q' N+ L9 i2 W8 N %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精
1 J6 D0 L; H% r
9 G/ N- ~5 h0 S- p4 A wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点$ Z* ~7 h8 `' R& P5 l$ a
$ X' X* b5 V' a/ ~! f2 t5 t5 e# S6 p
例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
) k) a% N/ ?4 u3 W5 r% H/ S% Y& \" @9 h. Q) S
默认是wav 5 n, x5 }' s/ n; ~0 l
例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点* `/ V3 q3 C* [
& R5 X6 Y7 T$ r- [- `! w0 v9 u
例子五:[...]=wavread(FILE,[N1 N2]) 返回每个声道的从N1~N2的样本点 |
|