見出し画像

【どーでもいい話】離散フーリエ変換できるのは(1/2)f「未満」までです

音声解析とか画像処理とかで離散フーリエ変換(DFT)することがありますが、再現できる周波数はサンプリング周波数をfとすると(1/2)f未満まででした((1/2)f以下ではない)。

ことの発端

時をさかのぼること、ハムスター時間で数ヵ月、将来的に人工ボイスを作るために、音声データ(波形データ)を離散フーリエ変換(以降DFTと記載)したり、逆離散フーリエ変換(以降IDFTと記載)したりして遊んでました。(人工ボイスの計画は結局、達成されることはありませんでしたが、その後、初音ミクが出てきたり、VTuberが出てきたり、駅の案内が人工音声になったりしたのを見ると、そこそこ需要はあったようですね。)
DFTした後にIDFTすると、変換前のデータに戻るはずでしたが、これがまったく一致せず、しかし音声再生してみると同じ音に聞こえて、なんでかなーって悩んでいました。当時、先輩にこの話を相談したこともありますが、「浮動小数点数演算の誤差」と言い切られて、そんなことないんじゃないかなーってもやもやしたまま、ハムスター時間で数ヵ月過ぎました。( ˙꒳​˙  )

画像4

解決に向けて

人工ボイス作成の計画を中断して数ヵ月後(「ハムスター時間で」です)、別件でDFTに触れる機会があり、DFTとIDFTした後に波形が再現されない原因が分かったのです。それは元の波形にサンプリング周波数のちょうど2分の1の周波数の波形成分が含まれていたことだったのですね。

画像4

その際に得た情報は、「波形情報はサンプリング周波数の2分の1未満までしか情報が保存されない」ということでした。「2分の1以下」じゃなかったのですよね、びっくりぽんぽんです。Σ(。•́ - •̀。)
それまで書籍みても論文みても、先輩からの話を聞いても、「サンプリング周波数は波形情報に含まれている最大周波数の2分の1以上にしないとダメ」って言われていたものですから、正しくは「2分の1より大きくしないとダメ」ってことに気付かなかったのですよね。
(実のところ、この件については当初から違和感こそ感じていましたが、理論的には理解できないでいました。基礎って大事ね。)

そして機会を改めて、サンプリング周波数のちょうど1/2の周期のデータを除外した音声データを使用して、DFTしてからIDFTしたら、めでたく元の音声データに戻すことができましたとさ。

画像3

めでたしめでたし。ε=ε=ε=ε= ワーィヽ(。・ω・)ノ タタタタ・・・

追伸

ていうか、安易に「浮動小数点数演算の誤差」とか言いきるのって危険よね。ㄟ(๑•́ ₃•̀๑)ㄏ


この記事が気に入ったらサポートをしてみませんか?