1
大学数学基礎解説
文献あり

CheapTrickとD4Cの窓関数について(メモ書き)

201
0

はじめに

この記事は,CheapTrick[Morise, 2015]とD4C[Morise, 2016]という音声処理の手法について,考察した事項をメモしたものです.窓関数を用いたDFTによる信号処理についてご存じであれば読めるかと思います.

なお,周期Tの周期関数で,区間[0,T]において自乗可積分であるものの全体集合をL2(T)と表記します.

CheapTrickの窓関数の性質

CheapTrickの窓関数が持つ重要な性質に「分析する信号が周期関数であれば,信号の時間シフトでパワーが変化しない」ことがあります.どういうことかというと,次の定理が成立します.

CheapTrick

fL2(T)なら,次式が成立する.
03T|w(t)f(t)|2dt=980T|f(t)|2dtwherew(t)=1212cos(2πt3T)

まず,f(t)w(t)周期3T周期関数としてフーリエ級数展開し,フーリエ係数をそれぞれf^nw^nとおく.すると,w^n
w^n={1/2(n=0)1/4(n=±1)0(otherwise)
である.したがって,g(t)=w(t)f(t)のフーリエ係数g^nは,畳み込み定理により
g^n=i=w^if^ni=14f^n1+12f^n14f^n+1
と書ける.

ここで,f(t)は周期Tの周期関数だから,n3の倍数でなければf^n=0となる.そのため,f^n1f^nf^n+1のうち,0でないものは1つしかない.よって
|g^n|2=g^ng^n=116|f^n1|2+14|f^n|2+116|f^n+1|2+i,j{0,±1}ijf^n+if^n+j0
である.したがって,パーセバルの定理から
13T03T|g(t)|2dt=n=|g^n|2=116n=|f^n1|2+14n=|f^n|2+116n=|f^n+1|2=(116+14+116)13T03T|f(t)|2dt=18T03T|f(t)|2dt
となる.f(t)Tを周期に持つから
03T|g(t)|2dt=3803T|f(t)|2dt=980T|f(t)|2dt
である.

この証明において本質的なのは「畳み込み定理」と「パーセバルの定理」であり,これらはどちらも離散フーリエ変換に対しても成立します.よって,この主張・証明は離散フーリエ変換に対するものとして書き直せます.

離散化されたCheapTrick

fnが周期Nの周期数列なら,次式が成立する.
n=03N1|wnfn|2=98n=0N1|fn|2wherewn=1212cos(2πn3N)

まず,fnwn周期3N周期数列として離散フーリエ変換する.すなわち
Fk=n=03N1fnei(2πk/(3N))n,Wk=n=03N1wnei(2πk/(3N))n
とおく.すると,Wk
Wk={1/2(k=0)1/4(k=±1)0(otherwise)
である.したがって,gn=wnfnの離散フーリエ変換Gkは,畳み込み定理により
Gk=n=03N1WnFkn=14Fk1+12Fk14Fk+1
と書ける.

ここで,fnは周期Nの周期関数だから,k3の倍数でなければFk=0となる.そのため,Fk1FkFk+1のうち,0でないものは1つしかない.よって
|Gk|2=GkGk=116|Fk1|2+14|Fk|2+116|Fk+1|2+i,j{0,±1}ijFk+iFk+j0
である.したがって,パーセバルの定理から
3Nn=03N1|gn|2=n=03N1|Gn|2=116k=03N1|Fk1|2+14k=03N1|Fk|2+116k=03N1|Fk+1|2=(116+14+116)3Nn=03N1|fn|2=9N8n=03N1|fn|2
となる.fnNを周期に持つから
n=03N1|gn|2=38n=03N1|fn|2=98n=0N1|fn|2
である.

次のJavaScriptを実行することで,この定理が成り立つことを数値的に確認できます.

      const PI = Math.PI;
const N = 300;
const x = [];
const w = [];

for (let i = 0; i < N; i++) {
  x[i] = Math.random();
  x[i + N] = x[i];
  x[i + 2 * N] = x[i];
}

for (let i = 0; i < 3 * N; i++) {
  w[i] = 0.5 - 0.5 * Math.cos(2 * PI * i / (3 * N));
}

let S1 = 0;
let S2 = 0;

for (let i = 0; i < 3 * N; i++) {
  S1 += (x[i] * w[i]) ** 2;
}

for (let i = 0; i < N; i++) {
  S2 += x[i] ** 2;
}

console.log(S1 / S2); // 1.125 = 9/8
    

D4Cの窓関数の性質

D4C

fL2(T)なら,次式が成立する.
04T|w(t)f(t)|2dt1.21840T|f(t)|2dtwherew(t)=0.420.5cos(2πt4T)+0.08cos(2πt2T)

まず,f(t)w(t)周期4T周期関数としてフーリエ級数展開し,フーリエ係数をそれぞれf^nw^nとおく.すると,w^n
w^n={0.42(n=0)0.25(n=±1)0.04(n=±2)0(otherwise)
である.したがって,g(t)=w(t)f(t)のフーリエ係数g^nは,畳み込み定理により
g^n=i=w^if^ni=0.04f^n20.25f^n1+0.42f^n0.25f^n+1+0.04f^n+2
と書ける.

ここで,f(t)は周期Tの周期関数だから,n4の倍数でなければf^n=0となる.そのため,f^n2f^n+20とは限らないことに注意すると,CheapTrickと同様に
|g^n|2=g^ng^n=(0.04)2(|f^n2|2+|f^n+2|2)+(0.25)2(|f^n1|2+|f^n+1|2)+(0.42)2|f^n|2+(0.04)2(f^n2f^n+2+f^n+2f^n2)Rnとおく
と計算できる(右辺の末項に注意).したがって,パーセバルの定理から
14T04T|g(t)|2dt=n=|g^n|2=(2(0.04)2+2(0.25)2+(0.42)2)14T04T|f(t)|2dt+(0.04)2n=Rn(1)=0.30464T04T|f(t)|2dt+(0.04)2n=Rn
となる.

ここで,n=Rnを評価する.コーシー・シュワルツの不等式,およびパーセバルの定理から
|n=f^n2f^n+2|n=|f^n2|2n=|f^n+2|2=n=|f^n|2=14T04T|f(t)|2dt
となる.したがって,三角不等式から
|n=Rn||n=f^n2f^n+2|+|n=f^n+2f^n2|12T04T|f(t)|2dt
と評価できるので,式(1)から
|04T|g(t)|2dt0.304604T|f(t)|2dt|04T|f(t)|2dt=4T(0.04)2|n=Rn|04T|f(t)|2dt2(0.04)2=0.0032
となる.04T|f(t)|2dt=40T|f(t)|2dtだから
|04T|g(t)|2dt1.21840T|f(t)|2dt|0T|f(t)|2dt0.0128
である.

以上により,不等式
(1.21840.0128)0T|f(t)|2dt04T|g(t)|2dt(1.2184+0.0128)0T|f(t)|2dt
が成立する.したがって(1.2184と比べて)±0.0128の影響が無視できる範囲においては
04T|g(t)|2dt1.21840T|f(t)|2dt
と近似できる.

参考文献

[1]
Masanori Morise, CheapTrick, a spectral envelope estimator for high-quality speech synthesis, Speech Communication, 2015, pp.1-7
[2]
Masanori Morise, D4C, a band-aperiodicity estimator for high-quality speech synthesis, Speech Communication, 2016, pp.57-65
投稿日:2021825
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

数学、特に応用数学が好きです。Mathlogでは主に、数学とプログラミングを絡めたようなことを書けたらいいなと思っています。

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. はじめに
  2. CheapTrickの窓関数の性質
  3. D4Cの窓関数の性質
  4. 参考文献