EDA365电子论坛网
标题:
Matlab之声音处理:对wav音频信号量化
[打印本页]
作者:
haidaowang
时间:
2020-9-11 16:37
标题:
Matlab之声音处理:对wav音频信号量化
# v3 ^* L# U( j& Q* T3 ]# `
对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。
% e. \1 h8 L9 U1 K7 j
8 ~5 u2 |$ S u6 R
量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,就是比如将信号在[-1,1]分成相同的很多段,要是某个值在其中某一段,就将其的值归为那一类。每一类都可以用一个唯一的二进制编码表示。
4 o3 P6 k& z- s" F7 N. J8 V( x& l2 I
% c5 D: a( G3 l9 e
现在我们要做的就是对wav的音频信号进行量化。具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作图比较量化前和量化后的图。那么第一步是什么呢?那就是获取样本点?不是的,我们第一步是获取我们需要量化的音频。可以用
2 z& l3 y! F6 z! w5 {3 ?
9 M& }1 N! I D* F& H6 E
step1:
0 g$ |8 _' j9 d) ]; c( `7 I
. g( P3 i# Y' h+ k3 I) ]
我们可以用[y,fs,nbits]= wavread('F:\a.wav',1024);即可得到我们所需处理的样本点。
; T/ |& F+ `( T3 L
+ }8 D) x% k* K3 o L' `
step2:对采集到的信号进行量化。
+ g/ w, W& n3 y. j& U5 w7 Y
1 ~! a9 M$ [& a9 t
方法一:直接使用量化函数->quantizer(做一个量化器),quantize(对某信号进行用量化器量化)
: Q$ \! O9 N6 `" t3 O4 c+ Z1 j
8 i- ?* t. m- | [2 l$ f( ^+ w+ |6 t
syms sample_point;
7 b. Y; E7 L j7 @
syms quantizion_bits;
; k+ u1 u1 d% p% c3 ^
sample_point = 200;
4 F$ W; ^6 J, K" T ]6 K
quantizion_bits = 5;
/ R! h! S, s9 W9 {/ f3 O
[y,fs,nbits]= wavread('road.wav',sample_point);
3 N* V5 z% j2 q _: x
sample = y(1:sample_point);
2 f. j, C8 e+ z. o% Q
n = 1:sample_point;
1 k, x$ c7 t/ V
q_riser = quantizer('fixed','round','saturate',[10,quantizion_bits]); %定义一个量化器
. J6 F! O R' }
q_tread = quantizer('fixed','ceil','saturate',[10,quantizion_bits]); %定义一个量化器
" g8 D7 I- v7 w# ~: |& f
mid_riser = quantize(q_riser,sample);%对采样信号进行量化
7 y- {* ], q/ J2 Z9 A7 |
mid_tread = quantize(q_tread,sample);%对采样信号进行量化
$ i k( S6 E$ e& q& H8 ~0 d1 T
subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
& N2 U$ b$ t+ b8 x: o3 w" X/ \ d# s
grid;
4 @, F. A z2 g4 z, O& B3 P
subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
$ U+ k& B9 } q7 Q9 @
grid;
( m7 U' B! D5 `; h) N2 U/ H1 J
9 f' X0 k$ E: S" z& I+ [) @8 Q# j
方法二:自己量化,更加灵活。
6 z* L0 _3 Q/ q: K. T: C
% Y+ F2 ]7 z* c) P% Y, j
syms sample_point;
" A3 Q# |3 z" I. M
sample_point = 200; %所需采集的声音样本点的数量
9 U T% n# O; C0 ^
[y,fs,nbits]= wavread('road.wav',sample_point); %提取出音频信号的前200个点
" D, U8 Z, F2 J
sample = y(1:sample_point); %提取出左声道的信号
! p7 k; Z$ F2 T8 g. u- v
n = 1:sample_point;
$ q) C/ F; A9 A- v& X' U
mid_riser = ones(sample_point,1);
0 J% m' t# i5 l J! d8 k
mid_tread = ones(sample_point,1);
0 c# ^5 ^& @( l8 [" ^
delta = 0.7/16; %采样间隔
* r7 v* d8 _' ?: H; A
for i = 1:sample_point %采用mid-riser的方法
0 p& _4 c8 R6 x: j" X) b5 x
inteval_rise = floor((sample(i) + 0.4)/delta); %计算有的采样间隔数
' w9 a m( R8 t$ U
inteval_tread = floor((sample(i) + 0.4 + delta/2 )/delta); %
- ^7 _# K" `2 I2 |, H/ _, j
mid_riser(i) = delta* (2*inteval_rise+1)*0.5 - 0.4; %mid_riser的方法
& r- A& R8 P; m7 Q( |
mid_tread(i) = delta*inteval_tread - 0.4; %mid_tread的方法
. \4 ?" d9 k4 P) ^' m" q
end
- s2 `. W/ N% H* Z! _. I
subplot(1,2,1); plot(n,sample,'r',n,mid_riser,'b'); title('mid riser');
" A/ _; H a1 ]1 C( _$ l- z, j
grid;
1 F* N, z% f: A/ M# E( U- t0 M
subplot(1,2,2); plot(n,sample,'r',n,mid_tread,'b'); title('tread riser');
5 z: Y7 h# l% M9 l, i2 U3 N4 u$ b' l
grid;
, O9 X0 L" U T. A
4 b5 K- h, g8 N3 O( Z# J
$ A% s% k' n0 f3 O0 s( m3 F
. }9 A) q2 F& z( b6 H+ e
参考函数:
3 \/ s! `- R4 S; }
* J, C$ g0 F# \6 r; _
wavread(wavread的具体使用,举例说明):
+ f+ M* d! z0 z: q8 ~
8 \( a/ R4 B. P1 H! H% h
例子一:[Y,F,b]=wavread('test.wav');
# \2 V8 F) ]# l# ?2 ~- y: U4 k- a
Y2=Y(((F*10+1):F*20),:);
" W t: q* e# u% u0 \7 x
wavwrite(Y2,F,b,'test_new.wav') ;%你在开始可能觉得无从入手,
. x, \1 p" C# q4 Y
3 q' G$ d3 J4 y' }% v( C# j+ ]- X9 P
%因为你要把绝对路径加进去
9 f/ o' f: d8 D, M1 A/ m
$ R+ Y8 I) e1 t- D! V* X1 t" N9 w% z! `
%以上做的就是将这个音频的10~20秒给Y2。加入我们听到
3 O" u4 ?6 N0 J8 N0 a
. d8 a8 d; e0 k. C1 F9 Q
%一首歌需要对其中某一部分进行操作,就可以这样做。
% M, o; J; I* _! l& m+ R
9 B' I9 ~& V1 m& P& r
例子二:[y,fs,nbits]= wavread(wavFile1);
0 k y) \0 u2 U+ R6 u+ I
0 a) W) w( {. p" l; ~
%y就是音频信号;
' h5 j9 n H4 r" M4 X2 q9 F
% g2 J$ K& `: ?, J. J/ \* K6 z" ?
%fs是采样频率,比如说16000就是每秒16000次;
% t6 Y0 v1 b2 d% l, j
0 p+ P0 V# a1 g* [$ Y" @* ~5 @
%nbit是采样精度,比如说16就是指16位的二进制码去表示数据;可以表示精
! T4 S$ Q5 C* C- K& `1 J
k$ q3 h4 W: _9 a* N) l" k
wavread('F:\a.wav',1024)%读取该音频文件前1024个采样点
$ d* X2 `" g# B: I% v
! I# Y( b/ y) z1 B! n; y
/ ]# k( h8 Q: e' K4 m
例子三:Y=wavread(FILE);读取文件FILE里面的数据,是wav结尾的,如果没有加wav,
% d) ^8 D8 m* G: Z8 x5 B
" o! J2 a5 n* d6 L* x
默认是wav
* h; M0 E8 y3 w0 Z7 h. `+ S. n1 U
例子四:[...]=wavread(FILE,N);返回的是每个声道的开始N个样本点
6 ^% W5 ]4 Z9 k: c! M
. \0 m* Q F9 a o% {* n* L
例子五:[...]=wavread(FILE,[N1 N2]) 返回每个声道的从N1~N2的样本点
作者:
younicp
时间:
2020-9-11 16:55
Matlab之声音处理:对wav音频信号量化
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2