|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
, S, h: l! p) Y' N2 ^; Z& |对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。( t, Y: c1 _( k: J$ |4 V0 y* |$ g
* F) i8 V- y1 `量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
- M3 f/ P- U5 }# I4 P1 `6 O& ~* d
/ Y$ a \ v P2 T4 x% C现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用8 C0 S% Y6 B; y( O1 q0 b- e
$ T5 R' n8 V9 ^0 w8 C: W8 \8 f
step1:2 j) D; m r) ~+ ^1 H7 z
8 P6 ]' Z! q# c+ a
我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。
/ B3 Z) N& t% t0 ?& t0 u+ i% N. p h
, f: I# w7 ]/ C: mstep2:对采集到的信号进行量化。' j. E0 {8 ?2 D, s8 }
1 }; }( x! g$ e9 } \/ M5 c 方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
d' r( |1 R9 p0 P$ A4 ?( ?- P4 D1 y f+ G7 r
syms sample_point;
4 N, ^ }0 C7 ~+ X$ X syms quantizion_bits; `3 `% _( J ?' y/ G
sample_point = 200;
7 B: J0 I" w4 U3 S0 e0 O% G quantizion_bits = 5;) F; U6 D- s- U7 A- z, ?5 J2 `
[y,fs,nbits]= wavread('road.wav',sample_point);
% D/ a- p( c; g' }# O sample = y(1:sample_point);
1 A+ n I" d( I n = 1:sample_point;6 L k+ w/ N' ]3 ~6 x) I( w
q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器
1 Q1 q+ e, H# |! M/ V/ V q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器% @( ` A5 l% T* \; m: @, V4 h: E3 o
mid_riser = quantize(q_riser,sample);%对采样信号进行量化
" e+ ]1 B2 r7 @# g mid_tread = quantize(q_tread,sample);%对采样信号进行量化8 ^' x' r" {- _/ h6 e
subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
% T( x4 f* ~$ a% w( {0 [# ]% Y grid;7 X& f5 X I: G7 T* E! V( R
subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');* W$ b: O+ ]- B. x' f
grid;
1 K o' z+ y/ F# m' C& D$ X4 T8 b
4 o7 Q% k4 e) f0 {, t 方法二:自己量化,更加灵活。3 E0 m! G* ~5 L# B) S$ o& l5 d
/ F7 E% B5 t9 d+ Z8 _ C; l6 }: \
syms sample_point;4 E" x" I) w0 z% ^( j
sample_point = 200; %所需采集的声音样本点的数量
- X# Y( i6 Q( ~& l4 i; f0 p [y,fs,nbits]= wavread('road.wav',sample_point); %提取出音频信号的前200个点( L/ L8 E4 h8 Q
sample = y(1:sample_point); %提取出左声道的信号6 N) L3 K0 h0 ~. N
n = 1:sample_point;
8 h u. P" P6 w6 I) R8 _& X& b mid_riser = ones(sample_point,1);9 x7 c6 k. T, Q8 B+ _
mid_tread = ones(sample_point,1);
8 n% a: u: i9 w5 C1 C delta = 0.7/16; %采样间隔
: j" w0 t6 U+ D9 ~9 m7 Y* n for i = 1:sample_point %采用mid-riser的方法3 k( c4 n6 a( w, o% l) L
inteval_rise = floor((sample(i) + 0.4)/delta); %计算有的采样间隔数; ]2 A7 v$ Z' o1 B
inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
5 f8 m6 h6 y% G/ ^1 w# {. z mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4; %mid_riser的方法$ c5 F4 A c+ R3 L$ X, c
mid_tread(i) = delta*inteval_tread - 0.4; %mid_tread的方法
/ p( E7 x) B$ `$ w& m% h end3 o9 \8 e8 A7 U& r7 q
subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');) G3 a I: S: q# y
grid;
' D1 j& |8 M7 R# D& A1 Z/ w/ u subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
Y, X$ _: _5 U grid;
+ X, ^( r2 D4 `4 Z9 e8 F* I6 ]) f; y" g V- N3 O- [1 A
" o" t( [/ G/ h( A9 {
/ v' V# ]& T+ V- x+ z* z/ G 参考函数:7 c/ m. ]9 d( y; i! {. b
/ Z3 X! W7 P: {) M) J wavread(wavread的具体使用,举例说明):5 V+ R1 Q, h/ E0 f! d
: c* M X( ~& }7 B4 E3 d 例子一:[Y,F,b]=wavread('test.wav');
% k {' i0 V F. c! ~6 z Y2=Y(((F*10+1):F*20),:);% ~0 h) f! w0 t0 B- q$ \9 \; N
wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,) N6 t/ M0 p0 s
/ f" |4 Z% ^" c8 w
%因为你要把绝对路径加进去
4 C- _6 X- t3 X! B, e! R/ L$ T2 a
' S) S! W% c& R' v8 [ j %以上做的就是将这个音频的10~20秒给Y2。加入我们听到 % H! z6 I7 z8 q5 }6 Z; k# I
6 a, ~& Z+ `( w9 r! w% [ %一首歌需要对其中某一部分进行操作,就可以这样做。' Z! ?6 N' n4 C% D0 Q
$ w4 [# _# ^1 {$ U9 X& Y8 |) J; v 例子二:[y,fs,nbits]= wavread(wavFile1);
; E3 b' D3 B: ^0 l( P1 W
" y4 g$ i- w6 V c" s9 m; B %y就是音频信号;0 `6 [5 d) g( n2 m) d% I
7 m0 y; z: K7 V/ B2 J2 T
%fs是采样频率,比如说16000就是每秒16000次;
) _& k) j) \6 X- B0 s# Q
( L/ c1 ^& H: G2 I %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精) D' i/ L+ d$ P( K& P, E
6 |( Y O" o9 l2 p E
wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点9 ?/ U: z( M6 G' E
9 i% t' @3 `$ f$ `3 J
0 M( |4 @0 n1 K# M' ]
例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,1 z6 J$ H& E. }- ]% B
5 K* P- F& r4 b3 r- k0 C" P 默认是wav ; B, N2 o3 V; i0 z+ Z% l
例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点
' u- B" n* Q/ v) c4 X$ ^+ C
6 ^! l, y$ } C: D) e2 | 例子五:[...]=wavread(FILE,[N1 N2]) 返回每个声道的从N1~N2的样本点 |
|