Report3

ヒューマンインターフェース
∼ Report3 ∼
学籍番号:065763J
氏 名:與儀那広
課題1
音声信号を y(n) として、LPC 分析により I 次の LPC 係数 ai を算出し、式 (1) により残差信号を算出しなさい。
r(n) = y(n) +
I
∑
ai y(n − i)
i=1
以下のプログラムを作成して式 (1) を実装した。
clear
start0 = 1
frame = 1
N=200
S=100
order=14
I=order
FS=10000
x=loadwave(’1.wav’)
len=length(x)
res=zeros(len)
y2=zeros(len)
y3=zeros(len)
// 分析次数
// 1.wav というファイルの読み込み
while 1
if frame == 1
start = 1
end2 = (N+S)/2 + 1
end;
if frame > 1
start = end2
end2 = start + S
end
// 1. 窓掛け
// Hamming 窓掛け&プリエンファシス
for i=1:N
win(i) = 0.54 - 0.46 * cos(2 * %pi * i / len)
x1(i) = (x(i+start0-1)) * win(i)
end
// 2. 自己相関
// 自己相関関数の算出
j=1
for i=0:order
r(j)=0
for n=1:N-i
r(j)=r(j)+x1(n)*x1(n+i)
end
j=j+1
end
// 3. LPC 係数の算出
// Levinson 算法による LPC 分析
[ar,sigma2,rc]=lev(r) // sigma2=r(0)+_sum_{i=1}^order(r(i)*a(i))
// 4. 残差
// 残差のスペクトルの算出
for n=start:end2-1
res(n)=x(n)
for i=1:order
if n-i < 1 then
continue
end
res(n)=res(n)+ar(i)*x(n-i)
end
end
frame = frame + 1
//1 以下を参照できません。
(1)
start0 = start0 + S
if (start0+N > len)
break
end
end
このプログラムを実行することで LPC 係数と、残差信号 r(n) を求めることが出来る。
課題2
課題1で求めた LPC 係数と r(n) を用いて、式 (2) より LPC 合成を行え。
y2 (n) = −
I
∑
ai y2 (n − i) + r(n)
(2)
i=1
課題1のプログラムの無限ループ内に、以下のソースを追加して式 (2) を実装した。
// 5. 合成信号 y’(n) の算出
for n=start:end2-1
y2(n)=res(n)
for i=1:order
if n-i < 1 then
continue
end
y2(n)=y2(n)-ar(i)*y2(n-i)
end
end
//1 以下を参照できません。
これを実行して求めた合成音声と、課題1で求めた残差、そして元になった音声を PLOT した。
!&$"
!&$!
!&#"
!&#!
!&!"
!&!!
!!&!"
!!&#!
!!&#"
!
"!!!
#!!!!
#"!!!
$!!!!
$"!!!
%!!!!
%"!!!
!
"!!!
#!!!!
#"!!!
$!!!!
$"!!!
%!!!!
%"!!!
!
"!!!
#!!!!
#"!!!
$!!!!
$"!!!
%!!!!
%"!!!
!&#"
!&#!
!&!"
!&!!
!!&!"
!!&#!
!&$"
!&$!
!&#"
!&#!
!&!"
!&!!
!!&!"
!!&#!
!!&#"
上から音声、残差、合成音声の波形になっている。もとの音声と合成した音声の波形には、ほとんど差が無いように見える。
また、実際に二つの音声を効き比べても差があるようには感じなかった。
課題3
式 (2) で r(n) を以下のようように変更して、残差信号を ratio サンプル毎に間引いた RELP 合成を行え。
{ ∑
I
− i=1 ai y3 (n − i) + r(n) n%ration == 0
y3 (n) =
∑I
− i=1 ai y3 (n − i)
else
課題1のプログラムに以下のソースを追加して式 (3) を実装した。
// RELP 合成音声の作成
ration=2
for n=start:end2-1
for i=1:order
if n-i < 1 then
continue
end
if modulo(n,ration) == 0 then
y3(n)=res(n)-ar(i)*y3(n-i)
else
y3(n)=-ar(i)*y3(n-i)
end
end
end
上記のプログラムの ration の値を 2,3,4,...,8 と変化させて実行して RELP 合成音声の波形を PLOT した。
0.12
0.10
0.08
0.06
0.04
0.02
0.00
!0.02
!0.04
!0.06
!0.08
0
5000
10000
15000
20000
25000
30000
35000
30000
35000
▲ ration = 2 のとき
0.15
0.10
0.05
0.00
!0.05
!0.10
0
5000
10000
15000
20000
25000
▲ ration = 3 のとき
(3)
0.12
0.10
0.08
0.06
0.04
0.02
0.00
!0.02
!0.04
!0.06
!0.08
0
5000
10000
15000
20000
25000
30000
35000
30000
35000
30000
35000
▲ ration = 4 のとき
0.10
0.08
0.06
0.04
0.02
0.00
!0.02
!0.04
!0.06
!0.08
0
5000
10000
15000
20000
25000
▲ ration = 5 のとき
0.10
0.08
0.06
0.04
0.02
0.00
!0.02
!0.04
!0.06
0
5000
10000
15000
20000
25000
▲ ration = 6 のとき
0.14
0.12
0.10
0.08
0.06
0.04
0.02
0.00
!0.02
!0.04
!0.06
0
5000
10000
15000
20000
25000
30000
35000
30000
35000
▲ ration = 7 のとき
0.10
0.0)
0.06
0.04
0.02
0.00
!0.02
!0.04
!0.06
0
5000
10000
15000
20000
25000
▲ ration = 8 のとき
ration の値が大きくなるにつれて RELP 合成音声の波形は、線が細くなっているのがわかる。これらの波形を聴いて比較し
てみると ration の値が大きくなるにつれて音声はバリバリというノイズが混じって聞き取りづらくなっていくのがわかった。
ration の値が 5 からは、何を言っているのかほとんど聞き取れなかった。
上記のプログラムでは ration の値の倍数以外は入力を 0 にして音を間引いているので、 ration の値を大きくすることでたく
さん音を間引くのでバリバリという雑音が混じり、何を言っているのか聞き取れなくなっているのではないかと思う。