ヒューマンインターフェース ∼ 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 の値を大きくすることでたく さん音を間引くのでバリバリという雑音が混じり、何を言っているのか聞き取れなくなっているのではないかと思う。
© Copyright 2024 ExpyDoc