FFTをする際にフレームデータの半分をづらしながら重複して行う処理を実装した。
結果は、信号が太くなって、高域のノイズが大きくなったようで、これで改善されているのかどうかわからない。
当初、処理時間が間に合うか心配していたけど、FFT1回の処理時間は8ms程度で、キャプチャ時間180msに対してかなり短いので、心配する必要は全くなかった。
PCの性能によっては、問題になるかもしれない。
効果はイマイチだけど、忘れないように、変更したコードを貼っておくしておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
private void WaveIn_DataAvailable(object sender, WaveInEventArgs e) { short[] datas = new short[8192]; float[] dataf = new float[8192]; Complex[] datac = new Complex[8192]; Complex[] fftdata = new Complex[8192]; for (int i = 0; i < e.BytesRecorded; i += 4) { datas[i / 4] = (short)((e.Buffer[i + 1] << 8) | e.Buffer[i + 0]); dataf[i / 4] = (float)datas[i / 4]; datac[i / 4].X = dataf[i / 4] * (float)FastFourierTransform.HammingWindow(i, 8192); datac[i / 4].Y = 0; } if (toggle) { datac.CopyTo(capdat0, 0); Array.Copy(capdat0, 4096, fftdata, 0, 4096); Array.Copy(capdat1, 0, fftdata, 4096, 4096); FastFourierTransform.FFT(true, 13, fftdata); for (int i = 0; i < fftdata.Length / 2; i++) { dBdat[i] = (float)(10 * Math.Log(fftdata[i].X * fftdata[i].X)); } dataready = true; pictureBox1.Refresh(); } else { datac.CopyTo(capdat1, 0); Array.Copy(capdat0, 0, fftdata, 4096, 4096); Array.Copy(capdat1, 4096, fftdata, 0, 4096); FastFourierTransform.FFT(true, 13, fftdata); for (int i = 0; i < fftdata.Length / 2; i++) { dBdat[i] = (float)(10 * Math.Log(fftdata[i].X * fftdata[i].X)); } dataready = true; pictureBox1.Refresh(); } FastFourierTransform.FFT(true, 13, datac); for (int i = 0; i < datac.Length / 2; i++) { dBdat[i] = (float)(10 * Math.Log(datac[i].X * datac[i].X)); } dataready = true; pictureBox1.Refresh(); toggle = !toggle; } |
キャプチャしたデータを一旦shortの配列にいれて、その配列からfloatの配列に移しているのは、キャストを使って直接floatの配列に入れると負の数が正常に扱われないため。