|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
( ?4 x; Z1 H% Y, {( H对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。
5 { \% E2 A' \6 Y3 U5 B+ i1 Y4 h
量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。4 z; ~5 o1 ]# @4 }) z6 C! T
7 Y' Q2 g' b# U$ Q现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用3 H1 R* f4 f1 k* H- y
2 j; d Y/ Y' a' Y" S
step1:( [6 r- x1 N' u0 C x+ ~& h
9 q# \2 h) T8 E7 c我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。
0 [2 |7 Y; F3 x* }9 Y/ y2 e8 ~$ u) g2 D
step2:对采集到的信号进行量化。/ C% j% k" V: L/ _* i9 E5 w
. A1 e; z' f; V: \ f- u. ?
方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
6 I% r' S" n% a# Z2 L9 p1 c
1 t5 L, q! k4 m* {7 c. S) n syms sample_point;% R' o! D8 f0 ?
syms quantizion_bits;
! S( H; F; s$ v2 ~. i. U K sample_point = 200;2 z4 v7 T6 P' ]+ O
quantizion_bits = 5;
5 a: q* }' w4 | [y,fs,nbits]= wavread('road.wav',sample_point);8 b. r- h1 B; M! w# v
sample = y(1:sample_point);% l& O: i) U& H! _0 R5 v
n = 1:sample_point;
: i2 x. @" S; a' @ q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器
0 f, a K: `- D* L4 S* s, m- ~ q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器7 c* }0 [2 G0 g# X) t" X; e; A
mid_riser = quantize(q_riser,sample);%对采样信号进行量化, Q' H- M, W! E( i6 P9 A' R
mid_tread = quantize(q_tread,sample);%对采样信号进行量化6 }) h$ Y+ x- b
subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser'); J; h# |7 X3 f, ~2 [7 z
grid;
$ u* u y/ V! P6 M subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
1 B8 }! g ?7 y- g) {: R9 Q- Y2 t grid;, n4 V3 e4 M) l2 q4 t; w) m
2 C. {9 |5 e* I% C1 z 方法二:自己量化,更加灵活。6 e/ \- ?1 P4 h' w
1 W: V$ V4 q- Q' k! L: A1 q( _
syms sample_point;
. n, h# R K7 X sample_point = 200; %所需采集的声音样本点的数量1 d$ Y- w9 a' z) e: n* v
[y,fs,nbits]= wavread('road.wav',sample_point); %提取出音频信号的前200个点& ~: O2 v" [" S
sample = y(1:sample_point); %提取出左声道的信号( ^& R! K) o0 \9 {
n = 1:sample_point; 6 \/ f2 W: \& O1 G& r. Q& X6 b
mid_riser = ones(sample_point,1);9 y$ Z/ ^' {' H2 U/ r1 I: n/ U- F
mid_tread = ones(sample_point,1);2 H L- |! a7 {9 ^1 f
delta = 0.7/16; %采样间隔7 N, l% t; ~) [" s4 q$ F4 u
for i = 1:sample_point %采用mid-riser的方法: X1 K, L1 t7 t1 u8 e" _6 C
inteval_rise = floor((sample(i) + 0.4)/delta); %计算有的采样间隔数& \. ?/ K; z! f* n
inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
2 X/ g* J" e+ D& I& s) \6 Y mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4; %mid_riser的方法* ^9 t/ c8 c6 C& |1 c/ T7 b# S) p0 D ]
mid_tread(i) = delta*inteval_tread - 0.4; %mid_tread的方法1 Z$ I& @! [- I1 v" U$ [: o
end. W' X) A6 ]! b& \) K
subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
8 W+ V( s8 n! J0 Z# a7 I3 [ grid;
& \- ]: E, Z5 L subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');& m6 ?- H2 ~) ?, R4 U3 y
grid;% Y* w% _6 f7 [6 ~ H
3 J0 c# G6 q u2 Q( A- A2 f4 i ) @( Q1 N- H k, C2 T8 G' k
D* A" I9 n4 L* ~, i1 w. W* | 参考函数:
) ~$ k- D; g1 O6 X+ A) `
9 \+ o3 {/ E1 R4 r wavread(wavread的具体使用,举例说明):5 Q( O7 S, x. n) z% `( k* q
* c& t4 }0 T2 q Y
例子一:[Y,F,b]=wavread('test.wav');
) n8 x9 P& Y! D+ r: }( M Y2=Y(((F*10+1):F*20),:);
# }/ M3 N1 L: N# s1 y% x" R wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,
! }* f4 {% `- l1 u
) A( Z9 G; \8 } M %因为你要把绝对路径加进去3 h! X: d9 T1 o- r7 ~7 Y* ]
9 p" V& Q, f- B$ _) E) z: b# i
%以上做的就是将这个音频的10~20秒给Y2。加入我们听到 : i3 }# ]! x; s6 [& h, U5 G" J0 {
! H$ r) t/ G* f+ X" @3 C* Q* _ %一首歌需要对其中某一部分进行操作,就可以这样做。
+ j- h- P' w. l! P" T0 x: C
! q8 V, Z5 F; q) B& r* S; Z& n 例子二:[y,fs,nbits]= wavread(wavFile1);
5 d# {9 [# V2 n
4 p4 Q, W U4 x/ X1 K8 P %y就是音频信号;
& ` \" z* K8 V6 W8 @/ T/ B
% W' h" U; O+ [ %fs是采样频率,比如说16000就是每秒16000次;
% ` A- |8 e; Z( l
2 A! q- j& H) V$ V" I %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精0 I( k* ^2 A$ J! ^* ]
3 ^% H1 u$ {3 P/ a8 H7 B; A wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点# U: Y/ o$ q" a& N4 ? b
# ]% n- T' \, T1 r/ v2 R
* ~/ f/ |+ Q; `' M
例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
; [, J4 N9 X+ ?! V D
+ d- q/ i/ [- d2 y/ g) H2 V! T! k3 V 默认是wav
6 T1 n4 I+ _( c4 n 例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点, s" s. R8 W: B F! v
; w5 ~2 w7 b: `$ c3 {3 d3 L
例子五:[...]=wavread(FILE,[N1 N2]) 返回每个声道的从N1~N2的样本点 |
|