ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2020/06/07

FFTの周波数ビンからずれた正弦波のパワースペクトルとサイドローブとか

FFT(とDFT)を使用した信号処理のコードを書いていて、半端な周波数をFFTしたらどういった結果になるのか試してみたので纏めました。

よくあるサンプリングレート44.1kHzでサンプリングされた音声波形を、窓長4096サンプルでFFTした結果は、44100/4096 = 約10.76[Hz] の周波数ビン単位で離散化された各周波数(0 , 10.76, 21.52,... ,22050[Hz])に分解されて表現されます。

ここで入力信号として正弦波をFFTする場合で、正弦波の周波数がちょうど周波数ビンと一致するケース、
・1001.29...[Hz](=10.76*93 ちょうど)
・1012.06...‬[Hz](=10.76*94 ちょうど)
では良いですが、周波数ビンに一致しない中途半端な周波数
・1006.67...[Hz](=10.76*93.5)
の時はどうなるんだったか、隣接する周波数ビンにパワーが分散するんだか、昔デジタル信号処理とかで学んだような記憶もありますが既にうろ覚えです。

FFTの周波数ビンからずれた正弦波のパワースペクトルは誤差が大きい

というわけで、100ビンから101ビンまで0.25周波数ビン刻みの周波数の正弦波(振幅1.0 = 0[dB])をFFTしてみたのが以下の結果です。(44.1kHz,4096sample,Hanning窓)
周波数ビンからずれた正弦波のFFT結果
ちょうど100bin,101binの正弦波をFFTした場合、メインローブは±1binに収まり、サイドローブもグラフ範囲外のかなり低いレベルとなっています。一方、少しでも周波数ビンからずれた周波数の正弦波をFFTするとスペクトルが広がっています。(スペクトル・リーク、Spectral leakage)
ずれ量が最大となる0.5ビン差の場合が最もスペクトルが広がります。

2014/11/15

JRE/JDK 1.6/1.7/1.8で発生するWin32ShellFolder2.javaの不具合について

一部の環境で発生する、JavaVM(ランタイム)自体の未解決のバグがあり、JFileChooser初期化時にJVM内部で例外が発生する場合があります。

人工知能超解像プログラム NeuronDoublerではバッチモードでのファイルダイアログとしてJFileChooserを使用している為、不具合が発生する可能性があります。

情報提供して下さった方、ありがとう御座います。


以下、Javaランタイムの不具合と回避策を記載します。


環境:

 ・Windows版 JRE/JDK、1.6/1.7/1.8、32bit/64bit

 ・以下のレジストリキーを変更し、エクスプローラにネットワークを表示させないようにしている環境。

  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace
  {F02C1A0D-BE21-4350-88B0-7367FC96EF3C}

  (参考リンク)ナビゲーションウィンドウやデスクトップ上の「ネットワーク」や「ライブラリ」を非表示にする方法は無いでしょうか?

  
原因:

 JFileChooserのコンストラクタを呼び出すと、カレントディレクトリがネットワーク上のフォルダかどうか判別する為、
 ネットワークフォルダのパスをネイティブライブラリから取得しようとするが、上記環境では見つからない為、Nullとなる。
 その際、sun.awt.shell.Win32ShellFolder2.getFileSystemPath()内部のNullトラップ漏れにより、例外(java.lang.NullPointerException)が発生する。


解決策:

 ・以下のレジストリキーを元に戻し、エクスプローラにネットワークを表示させるようにする。

  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace
  {F02C1A0D-BE21-4350-88B0-7367FC96EF3C}

2013/10/20

NeuronDoublerでBATコマンドからのJVM起動が上手くいかない場合の対処法について

人工知能超解像プログラム NeuronDoublerでBATコマンドからJVMを起動できないとの問い合わせを頂きましたのでJavaのランタイム(JVM,JRE)のエラーメッセージと対処法を記載しておきます。


>Error: Unable to access jarfile NeuronDoubler_v*.jar

jarファイル名のワイルドカード指定が動作しない環境で出ます。バージョン指定部分を明示的に指定して回避可能です。
例: NeuronDoubler_v*.jar → NeuronDoubler_v311.jar


>Error: missing `server' JVM at `C:\Program Files\Java\jre7\bin\server\jvm.dll'.
>Please install or use the JRE or JDK that contains these missing components.


NeuronDoublerはJavaの実行速度を少しでも高速化する為、-serverオプションを指定しています。
上記エラーは使用しているJVMが-serverオプション非対応の場合に発生するので-serverオプションを削って下さい。


>Error: This Java instance does not support a 64-bit JVM.
>Please install the desired version.


32bit用のJVM環境なのに-d64オプションを付けると出ます。64bit版のJREをインストールするか-d64オプションを削って下さい。


>Error occurred during initialization of VM
>Could not reserve enough space for object heap
>Error: Could not create the Java Virtual Machine.
>Error: A fatal exception has occurred. Program will exit.


指定したヒープメモリが確保できなかった場合に出ます。(特に32bit環境は出やすいです)
最小メモリオプション: -Xms512m
最大メモリオプション: -Xmx1500m
を環境に合わせて少ないサイズに指定し直して下さい。(単位はMB)