|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1 ~' { l. [" U
对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。# w: n; m; y4 N% N( Z5 o
' f, u2 ~8 j0 r' v7 ?0 ?& @
量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
% {' [, a0 N& @( t9 f
# d. C u- S; E3 W6 T8 c现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用
% k! L& U2 |( G
) H' f/ m: f. k4 y4 S+ d7 Sstep1:& v3 E" F9 v+ ]% Q( B D
4 L, j; U1 \, ~5 t x" Z我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。
0 R+ B6 v6 K& t: F* }8 o
2 G/ V. ]( J! A a2 I! a8 ^; Ostep2:对采集到的信号进行量化。
1 y" T8 \& c U' Z5 Q( V7 w' W9 B2 O" `" g
方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
( q" r* f' T9 b% M1 t. \0 h( C
2 m2 L( H% r9 O6 u. p/ F syms sample_point;0 T' {3 W1 b* `$ V6 W
syms quantizion_bits;
3 s/ `8 V, h( k7 I2 w, D sample_point = 200;
/ l7 I$ q. C, p+ D: P- l& y6 q quantizion_bits = 5;7 T- a( ]! b+ n5 |5 q+ N' u1 n9 F
[y,fs,nbits]= wavread('road.wav',sample_point);
: J5 M6 b$ [0 K m; U# ~ sample = y(1:sample_point);$ R z# g% ^6 v
n = 1:sample_point;
3 \/ V. a4 }& V- T5 ~ H( {0 a: z4 x q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器
: z) n4 W/ U3 J$ n7 J$ t q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器$ Q8 j+ ], `- H3 o1 H
mid_riser = quantize(q_riser,sample);%对采样信号进行量化# N; P4 d! B- o, i
mid_tread = quantize(q_tread,sample);%对采样信号进行量化
L7 N6 G. ], V! x3 ~; G5 q! |% ` subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
7 J3 d( o: i+ j grid;3 L5 t F9 U) [# h# L* u
subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
+ {7 v4 ^% }$ p3 E! [ grid;9 y0 M# K; G4 J8 v
9 L5 `; {6 j+ `+ | 方法二:自己量化,更加灵活。
5 f: U9 o' A. I2 O/ H3 W4 G3 t9 Y* X% ^" E7 U
syms sample_point;" ^0 Y) Q0 P1 x: @3 t' k+ n& H
sample_point = 200; %所需采集的声音样本点的数量
- d0 r: l/ a1 q, N H [y,fs,nbits]= wavread('road.wav',sample_point); %提取出音频信号的前200个点
* R/ O, g( Z. {/ t' g0 h9 t3 b" D sample = y(1:sample_point); %提取出左声道的信号
+ ?+ \; A+ o. V( V- P3 |% k" T* A: p n = 1:sample_point; . S: M& \& s. i) \! u$ k5 }9 n
mid_riser = ones(sample_point,1);1 U9 @2 H' @" D, N; Y- I
mid_tread = ones(sample_point,1);
; N; C$ T# C0 L; l delta = 0.7/16; %采样间隔2 k' U' A/ F2 d" A# P
for i = 1:sample_point %采用mid-riser的方法
/ \" x4 e" ~, H7 s4 L. T8 R inteval_rise = floor((sample(i) + 0.4)/delta); %计算有的采样间隔数- ^+ {/ _; o( o7 y& Z) I
inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
" `/ Y! y. C: h& ?2 Q mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4; %mid_riser的方法
# O* s: j0 R2 p8 }$ q' f4 X mid_tread(i) = delta*inteval_tread - 0.4; %mid_tread的方法" B4 A0 S- g% s; o6 p k
end
% \8 `- B( E |2 G: v2 v( f) c subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser'); ?! Q9 x; Z" ~5 @+ p
grid; o4 U0 `! O0 }/ P% \0 A6 j" \
subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
- ^6 r5 @ F: V/ s, N grid;
* @6 `2 k' K4 j* K5 I( r* C
: b. F/ b2 |. o) l. p. H: R+ A
- G/ q4 ]4 z/ A) n: p' S7 y( O- F
0 Z v' L( R% k6 _0 _3 E 参考函数:
9 Y5 X6 ~! r6 ]5 u% u9 b0 v- t: y+ b) A9 I8 t
wavread(wavread的具体使用,举例说明):
' i4 }6 _8 ?" v7 Z( k9 L( p2 B/ _/ Z9 I1 p9 }1 f6 p
例子一:[Y,F,b]=wavread('test.wav');! j( ]4 q6 X/ y) |% h+ Z. u
Y2=Y(((F*10+1):F*20),:);8 B4 ]: U8 \% S. W! Y( C+ i
wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,# J" W& g8 N' o u
2 c2 C- W& C: s4 d& S& f; S
%因为你要把绝对路径加进去4 a/ O0 z5 Z6 }6 C3 U( s
3 V) Q& X4 O( w; Q3 D %以上做的就是将这个音频的10~20秒给Y2。加入我们听到
d3 N0 _& k% E- f" ?/ Q2 ~% \, i
8 E- l0 R& Z0 Z! _1 ~ %一首歌需要对其中某一部分进行操作,就可以这样做。, z4 F& C" a |
+ Q+ D$ c% @# b7 G& d7 c 例子二:[y,fs,nbits]= wavread(wavFile1);1 Z6 d' e4 v: ]( {% Z6 V* a* b: _
: K4 D' t+ e) m; ^4 r3 q
%y就是音频信号;
, H7 A3 u; h4 U6 M( d7 q/ H: e( D% J5 |, I) c
%fs是采样频率,比如说16000就是每秒16000次;- E/ F7 C3 e5 h$ a8 J
% [3 [4 W, o* P: H8 P" G
%nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精
$ i( c l1 _2 i" H
5 z) m' X: H) R9 y wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点/ N1 I$ G- f0 C E7 P" y4 A" J( l
% L0 U6 t8 i, M* l2 d1 _
! s" K7 b' f2 s" A 例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
% j0 K# W$ h u8 h* x
; F5 A5 S [; R8 E$ z8 T5 x 默认是wav
4 _& t6 E# V0 ~; x; d8 F( i 例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点
" Q p0 J5 `$ X9 D$ Z1 v6 j$ s7 a' Y& ^7 v; g* U
例子五:[...]=wavread(FILE,[N1 N2]) 返回每个声道的从N1~N2的样本点 |
|