|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
: H6 S" H. T+ k$ G* K) J对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。, e* b% {( l2 l# c; x8 t7 j
4 f/ X5 m/ m5 P" G) x% g9 A; T1 t量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
- v" U# ~4 m. q1 \0 r9 Y7 Q9 O/ {4 ?2 Y1 ]
现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用- \) b, U9 R# N1 c
/ c$ x0 u' |- J7 k: d! Astep1:
3 \+ j) j3 \! ?$ U' ?, m! N$ a2 o3 s, k% [8 e z$ N1 I
我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。4 A% }' _) [( j; U
1 p- n% J4 v, Nstep2:对采集到的信号进行量化。$ ~3 t0 R$ M2 g6 h/ M. E+ O
6 x, A1 |/ R! ^# w8 }; k# ~ X 方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
9 P+ l+ M. k: m! L8 x( |7 _/ `! w9 \+ }3 s" O' a' l5 {% t: Z
syms sample_point;+ D; t+ Y. U4 q/ m$ k7 |: G7 c, X
syms quantizion_bits;# L* R9 F( r9 ?4 m3 @ a1 H
sample_point = 200; p- I$ Z. I Z7 U6 v) d0 [$ I
quantizion_bits = 5;7 e+ ^8 b! ]' o7 J: i0 F; V; a
[y,fs,nbits]= wavread('road.wav',sample_point);
) ]7 G# \ `# I, X, Z0 c- K sample = y(1:sample_point);5 w& b( v% f3 W% z7 _- J9 N& G( W
n = 1:sample_point;
% o S4 @! N! V. |2 I9 _ q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器& b: ^* y$ p) O0 `2 Z
q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器
, d. a( U# j" r6 ` mid_riser = quantize(q_riser,sample);%对采样信号进行量化9 k0 r, ^8 }; C1 d/ U: }$ ^
mid_tread = quantize(q_tread,sample);%对采样信号进行量化
2 Y& h- V: i5 @5 x subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');6 ] `* p9 u# T5 D) A7 m* i" h$ r
grid;( w8 g7 F+ \& r" f0 i
subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');: S: a7 j6 l) f% @" u3 R6 r" u
grid;7 t) k9 d( Y( G& ^# R
7 N3 N: U+ |) u& ]' U 方法二:自己量化,更加灵活。( _. Q$ h* v9 O9 d. G/ H1 d
6 D `" X/ q0 s: j0 U
syms sample_point;
, ?; u( T M# a# ^$ _9 q" K U sample_point = 200; %所需采集的声音样本点的数量, ]& o# J- ^9 N0 ]/ `8 G) g
[y,fs,nbits]= wavread('road.wav',sample_point); %提取出音频信号的前200个点2 W% Y2 ?" ~2 s3 z0 K2 k5 G, {
sample = y(1:sample_point); %提取出左声道的信号
* T+ s0 b/ ^$ m n = 1:sample_point;
' T! I1 m+ q, g) Z( N mid_riser = ones(sample_point,1);
5 f/ o- A3 r6 C$ y' L mid_tread = ones(sample_point,1);
* j1 c1 Y; r/ n0 p. V8 r delta = 0.7/16; %采样间隔
( g9 f" \/ P6 R) z/ ` for i = 1:sample_point %采用mid-riser的方法& m! r! Q9 Q4 n9 B2 t
inteval_rise = floor((sample(i) + 0.4)/delta); %计算有的采样间隔数
( q% e9 g5 U7 M" s) w: k7 S inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
& X: j/ s$ u" D2 _4 ^ mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4; %mid_riser的方法
N3 _$ `# T5 R! q A) ]% B mid_tread(i) = delta*inteval_tread - 0.4; %mid_tread的方法
2 m& f4 |; G/ z' ]/ U4 m8 p$ c end5 T) v* W! A2 m* G; I* p: x; m
subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');$ l- S. Q3 t4 e- x9 S
grid;
# u# `& W% {: w, P% U. a; Y9 \ subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
/ C2 Y+ |6 G4 D" h3 k$ h8 j$ E grid;' Z& q: d- Q0 ?8 {3 W$ C! \$ N. ^
: k% \) C1 T/ ^% V* K- v7 e% Q
% e% B9 H3 M: z) A8 Z2 k7 T2 T" U
8 e& K4 I8 `: |; T5 ]: J 参考函数:5 p6 ?" p3 s5 H C k9 ~
& G& A" j1 w; f! {5 x
wavread(wavread的具体使用,举例说明):
. j7 d% q- ~ p6 e1 k* g- F. l! b# t+ @
例子一:[Y,F,b]=wavread('test.wav');
- e3 d0 U7 T0 t: P* N( r Y2=Y(((F*10+1):F*20),:);# G$ r: e. h2 T0 \! e0 t" O9 h
wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,# j% d Q. u- U4 B. S
$ S$ B$ F8 Y \- a
%因为你要把绝对路径加进去
- A2 y, @5 \: Q) N1 I A5 Y0 ?: R2 O1 \8 j. t# x
%以上做的就是将这个音频的10~20秒给Y2。加入我们听到
7 z; V2 d. a5 M% N6 m* G
1 n5 w6 I1 e) L8 A4 S0 C( g& | %一首歌需要对其中某一部分进行操作,就可以这样做。7 v3 N! I# W! z1 X! [; S! n$ ?
' x( D" B: s/ j0 n& q 例子二:[y,fs,nbits]= wavread(wavFile1);# o8 q+ e, r- x& J) o1 C; d; Z
! {& }$ d0 C& `/ t1 d/ Y
%y就是音频信号;; `, M0 ]' l& @/ W9 g j
2 B5 E& ]; U' L* E/ Z
%fs是采样频率,比如说16000就是每秒16000次;! W/ V7 ]% X3 n/ `' x8 k9 b+ G
, Z' G) C6 R3 ?' I$ i %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精; W: M4 c9 P j
7 _( c% A! I& y5 y0 {* Q
wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点
8 U+ ^! Y2 x' Y6 a' i# a9 ^- ?, ~ 1 g/ h# t Q: i9 G
4 A% Z# I3 K4 H4 A9 G* v1 b
例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
( P; G6 R: r8 }# ]% A# Z: G8 N2 U- A& D5 f2 a: L$ n' m
默认是wav 7 v* A) L; V: m$ _9 G8 t: E( }
例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点
, c1 c- W' N7 ?. `9 {9 J
( V$ R+ s+ C; q! g/ v# x7 @1 F+ w 例子五:[...]=wavread(FILE,[N1 N2]) 返回每个声道的从N1~N2的样本点 |
|