0
オーディオビーコンは18khzから19khzの間で異なる周波数を生成しています。AudioTrack Apiを使用してすべての周波数を記録しようとしています。このリンクを参照しました。私はすべてのデータが0になっているハニングウィンドウ関数を適用した後です.1)どのようにハニングウィンドウを適用するには? 2)周波数をフィルタリングする方法3)さまざまな範囲の周波数のオーディオを録音し、それを.wav formateに保存します。そのオーディオファイルを読み込み、周波数に変換します。しかし、高い周波数が得られます。複数のピーク周波数を取得する方法?ハニングウィンドウ機能を適用する方法
int fftSize = 1024;
public void startRecord() {
short[] bytebuff = new short[2 * fftSize];
while (started) {
int bufferReadResult = audioRecord.read(bytebuff, 0, bytebuff.length);
if (bufferReadResult >= 0) {
fft(bytebuff);
}
}
}
public void fft(short[] bufferByte) {
int N = bufferByte.length;
DoubleFFT_1D fft1d = new DoubleFFT_1D(N);
double[] fft = new double[N * 2];
double[] magnitude = new double[N/2];
for (int i = 0; i < N; i++) {//Hann window function
bufferByte[i] = (byte) (bufferByte[i] * 0.5 * (1.0 - Math.cos(2.0 * Math.PI * i/(bufferByte.length))));//here i'm getting all data is zero.
}
for (int i = 0; i < N - 1; ++i) {
fft[2 * i] = bufferByte[i];
fft[2 * i + 1] = 0;
}
fft1d.complexForward(fft);
// calculate power spectrum (magnitude) values from fft[]
for (int i = 0; i < (N/2) - 1; i++) {
double real = fft[2 * i];
double imaginary = fft[2 * i + 1];
magnitude[i] = Math.sqrt(real * real + imaginary * imaginary);
}
double max_magnitude = -1;
int max_index = -1;
for (int i = 0; i < (N/2) - 1; i++) {
if (magnitude[i] > max_magnitude) {
max_magnitude = magnitude[i];
max_index = i;
}
}
int freq = max_index * 44100/N;
Log.e("AudioBEacon", "---" + freq);
}
おかげではなく、バイトの短期変更私はcomplexForwardまたはRealForwardを使用する必要がありますか? – Siddharthan
複数のピーク周波数を取得する方法を教えてください.1秒を記録します。私のビーコンは1秒間に3つの異なる周波数を生成します(18000,18500,19000hzなど)。しかし、ピーク周波数は19000hzだけ高くなります。 – Siddharthan
デバッグを行う必要があります。スペクトルの大きさをプロットして、何が起こっているのかを見てみましょう。 –