|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
. v+ T6 D2 d2 ~& u" N9 a- Z对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。
, i( e5 Q% U5 x5 h- t- R
: O& @9 }- j# E7 J8 `1 n! `量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
) \8 N: Y, Y! e3 L( R% y- m; s$ n- N& p! z
现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用
5 o1 `! \& a: `6 M. n4 |- M6 k5 C& X3 B) x8 i" L8 S
step1:
5 {0 C* N: k: _8 Q
4 I" m( M9 \9 M+ ~8 C2 U我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。! ^- \3 d- k1 G* t% I: y' w
# `" t. E+ y3 `4 ^% T' Kstep2:对采集到的信号进行量化。
; |% J% G6 j' F+ @5 W3 N3 S. Q" u' z9 O
方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
, e9 \4 L) O" {" G( [1 i
9 N5 h. A2 D, C; w; v/ } a syms sample_point;/ m' g0 O4 [& H, g0 M
syms quantizion_bits;6 k( ?. T; W# t- _
sample_point = 200;
1 z4 u% E% g& X7 }) d6 Y quantizion_bits = 5;0 N' V5 E: n3 ?$ c
[y,fs,nbits]= wavread('road.wav',sample_point);
: ^+ ]9 ^8 x2 t g sample = y(1:sample_point);9 H0 c9 L* W* n$ d, }9 ]% l+ u9 b
n = 1:sample_point;
. |$ `0 j+ O) I3 U q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器
, I1 c! W9 [6 v6 J$ _ q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器
* C* k6 n/ L# ^- O mid_riser = quantize(q_riser,sample);%对采样信号进行量化1 X1 z) z* }7 t* j p* o$ j. Q) n
mid_tread = quantize(q_tread,sample);%对采样信号进行量化
( }0 D1 }# ]. K0 `1 {8 p# P subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');, {' I+ d- P9 J! m! N4 ]- j
grid;" r$ B ~! \. t0 z
subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
4 T0 A& W3 x$ m7 D. Q1 ? grid;
M# [: |6 L) |" j; N5 a
. t8 n S9 l. n7 A0 G' g 方法二:自己量化,更加灵活。3 X% F% R) w2 h( B. w
- y2 I" o0 |1 t syms sample_point;
) w" s7 Z) Z( ? sample_point = 200; %所需采集的声音样本点的数量$ s8 o: q& }* k' w; [
[y,fs,nbits]= wavread('road.wav',sample_point); %提取出音频信号的前200个点" y5 i0 ?; Z. T9 Q
sample = y(1:sample_point); %提取出左声道的信号- H9 L' g5 v# L6 a Y9 d- [* w
n = 1:sample_point;
- V1 v5 U6 b( y mid_riser = ones(sample_point,1);
0 S5 z6 H5 Y5 |2 |6 v& M mid_tread = ones(sample_point,1);; [& d% I& R4 W4 m7 O4 ^" U i# K
delta = 0.7/16; %采样间隔
' ]- R, j: {4 d: r4 y& p1 m for i = 1:sample_point %采用mid-riser的方法
8 U, g/ {) E" e$ p inteval_rise = floor((sample(i) + 0.4)/delta); %计算有的采样间隔数
3 n/ Z0 a- I" G: A# L- [5 p9 { inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
$ H: R6 N! T) M; T7 v5 B mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4; %mid_riser的方法: N. z* u3 ?. s b
mid_tread(i) = delta*inteval_tread - 0.4; %mid_tread的方法2 ^. O4 _* \+ ~: P' x6 w, d
end
& q7 h: c& e9 L" G subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
# o8 z6 K7 d6 A0 x grid;. ~7 F! i; @6 H. [ K
subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');1 O9 e# B7 G3 S V
grid;
* c4 e/ K7 o# ?% N: P% y
) g8 q% H a2 ^4 e, R * Y0 m( `. u- N0 I
# D8 w# x! `, j" q
参考函数:
4 I$ `# N) P2 s6 p4 }& j1 J. o# D) ~# r1 z6 Y! q# I R! i: c
wavread(wavread的具体使用,举例说明):
/ e4 W: o2 p4 F+ [8 ^1 X1 u( R, E
例子一:[Y,F,b]=wavread('test.wav');
2 ?7 r6 F9 D- K2 x Y2=Y(((F*10+1):F*20),:);! r& g' I( k. |' g5 H
wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,
) r, ?( Q& L! |8 J. x* L# s5 R# S# O" I/ o, T" d
%因为你要把绝对路径加进去1 e, H1 f9 t3 u
, _5 ^# D$ w, @# w" R, {* B %以上做的就是将这个音频的10~20秒给Y2。加入我们听到 7 S p7 @' x, C. P5 s; t
# s4 A0 Q& x2 @
%一首歌需要对其中某一部分进行操作,就可以这样做。
5 L4 M5 O D3 c6 ]
, t# C4 m( Q* T8 C 例子二:[y,fs,nbits]= wavread(wavFile1);
# e7 g9 D/ q# \3 n3 Z: w
. k$ c% e& K7 Z4 g6 }& F %y就是音频信号;: c/ i0 w6 ?6 X" g, ^4 |
! o+ ?6 J" O) ]# W+ s
%fs是采样频率,比如说16000就是每秒16000次;& G( F' x( e& R
" x; e, K0 ^/ H" f- z' a" R %nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精
' b8 H/ x0 t% r6 J' q+ x. H1 V$ t
" _ a, X& F1 V- B2 H- ^ wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点
4 C/ f' ]0 F+ L2 b1 u7 G 5 o6 _( b, n; N. o& E& b! \
4 U; j0 {) G" \: a 例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
N( M. u+ ]# V5 V2 }6 X, M$ b
. N: d" ^' t) T' j% x: M/ ? 默认是wav
, }/ d8 m% s( v' l' C# { 例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点
. ]. Y( w, h0 q- ~) W) {: Q. [0 F/ J. I
例子五:[...]=wavread(FILE,[N1 N2]) 返回每个声道的从N1~N2的样本点 |
|