TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

FFT

pocketfftを使ってみる

FFT

先日、Whisperで音声認識する処理を実装した際に、FFTの処理でフレームサイズが2のべき乗でない場合にどうやって処理するか戸惑った。Whisperではフレームサイズが400となっており、NAudioのFFTでは、フレームサイズが2のべき乗という制約があり使用できなか…

スマホでのFFTの処理時間

FFTでスペクトル推定を行う際、フレーム長を長くするほどより周波数領域で精度を上げることができる。しかし、フレーム長を長くすると実行時間も長くなる。スマホでリアルタイムで解析を行うような場合、実行時間について考慮が必要になる。ここでは、フレー…

自己相関関数とピッチ推定の誤差

ボーカル音程モニター(Vocal Pitch Monitor)では、ピッチ推定に自己相関関数を使用している。自己相関関数を使用するメリットとしては、 ノイズに強い 低周波数での誤差が少ない という点があげられる。逆にデメリットとしては、高周波数の誤差が大きくなる…

ゼロパディングとFFTによるスペクトル推定の精度

ボーカル音程モニター(Vocal Pitch Monitor)では、ピッチ推定に自己相関関数を使用しているが、精度を高めるために、FFTの値も使用している。離散フーリエ変換(FFT)で、スペクトル推定の分解能を高めるために、ゼロパディングという手法が用いられる。ここで…

AndroidスマホにおけるJavaとNativeの速度比較

Androidのアプリで、FFTの計算をNDKでNativeで実装した場合に、速くなるか検証してみた。 測定条件 大浦版FFTをJavaに移植したコードとC言語のコードを使用する FFTのフレームサイズは4096 NativeはNDKでJNIのメソッドとして実装する NativeのメソッドはJava…

FFTと窓関数に関する考察

前回の日記で、ピークの周波数の周辺のパワースペクトルの和がエネルギー(全周波数のパワースペクトルの総和)に占める割合について書いたろころ、Chachayさんからスペクトル漏れについてご指摘を頂いた。chachay.hatenablog.comFFTについてのはじめの日記を…

FFTとエネルギーについての考察(続き2)

前回の続きです。ピークの周波数の周辺のパワースペクトルの和がエネルギー(全周波数のパワースペクトルの総和)に占める割合を、400Hzから500Hzの範囲で0.1Hzおきに調べてみた。 fset = np.linspace(400, 500, 1001) range = [1, 3, 5] for r in range: peak…

FFTとエネルギーについての考察(続き)

前回の続きです。周辺のパワースペクトルの和を測ることで、周波数分解能の整数倍とのずれの影響をどれだけ抑えることができるか調べた。周辺3つのパワースペクトルの和をとった場合のピークの値を、400Hzから500Hzの間を0.1Hz間隔で調べた結果、以下のよう…

FFTとエネルギーについての考察

前回の日記で、FFTのピークの値は周波数分解能の整数倍とのずれによって値が変わるため単純には比較できないことを説明した。ここでは、周波数全体のエネルギーについては、周波数分解能の整数倍とのずれによらず一定となることについて考察する。エネルギー…

自己相関関数を使用した基本周波数の測定

昨日の日記で、FFTのピークは、周波数分解能によって決まる基底関数の最小周波数の整数倍とのずれによって値が変わることを説明した。ここでは、自己相関関数を使用すると周波数分解能によらず安定して基本周波数を測定できることを示す。 まず、FFTで倍音を…

FFTのピークでは基本周波数を測れないわけ

囲碁ばかりだったので久しぶり音ネタについて書きます。AndroidとiOSでリリースしている「Vocal Pitch Monitor」では、基本周波数(ピッチ)の測定に自己相関関数を使用している。基本周波数はFFTのピークで測れるのではないかと思われがちだが、FFTのピークで…

コンパイラによるFFTの速度比較(再測定)

以前の日記で、コンパイラごとのFFTの実行速度を比較した結果を記載しましたが、この記事を見て、gccがVisual C++に比べて速いという内容が以前の私の測定と違っていたので再測定を行いました。この記事で使用しているgccは、MSYS2のものを使用しているよう…

コンパイラによるFFTの速度比較

※記事の内容は古い内容となっています。こちらに再測定した結果があります。 コンパイラによってどれだけFFTの実行速度に違いがあるのか比較してみた。Visual C++ 2013で、x86とx64それぞれの版とx86はオプションにSSE2を有効にした版、x64でPGOビルドを有効…