Cara menghitung titik FFT dari sampling rate dalam rekaman audio

Saya memiliki kode sampel yang menetapkan tingkat pengambilan sampel, titik fft dalam rekaman audio. Kode ini adalah

private static final String FILE_NAME = "audiorecordtest.raw";
private static final int SAMPLING_RATE = 44100;
private static final int FFT_POINTS  = 1024;
private static final int MAGIC_SCALE = 10;
private void proceed() {
        double temp;
        Complex[] y;
        Complex[] complexSignal = new Complex[FFT_POINTS];

        for (int i=0; i<FFT_POINTS; i++) {
            temp = (double)((audioBuffer[2*i] & 0xFF) | (audioBuffer[2*i+1] << 8)) / 32768.0F;
            complexSignal[i] = new Complex(temp * MAGIC_SCALE, 0d);
        }

        y = FFT.fft(complexSignal);

        /*
         * See http://developer.android.com/reference/android/media/audiofx/Visualizer.html#getFft(byte[]) for format explanation
         */

        final byte[] y_byte = new byte[y.length*2];
        y_byte[0] = (byte) y[0].re();
        y_byte[1] = (byte) y[y.length - 1].re();
        for (int i = 1; i < y.length - 1; i++) {
            y_byte[i*2]   = (byte) y[i].re();
            y_byte[i*2+1] = (byte) y[i].im();
        }

        if (handler != null) {
            handler.onFftDataCapture(y_byte);
        }
    }

Kode itu digunakan untuk merekam file mentah dari rekaman audio. Namun, saya ingin mengubah SAMPLING_RATE menjadi 16000. Bisakah saya menggunakan FFT_POINTS yang sama yaitu 1024? Jika tidak, Tolong sarankan kepada saya cara menghitungnya dan MAGIC_SCALE. Saya mencoba menggunakan nilai-nilai itu tetapi suaranya muncul noise. Terima kasih. Tautan referensinya ada di sini


person Jame    schedule 04.09.2015    source sumber


Jawaban (1)


Algoritma FFT tidak mempedulikan laju pengambilan sampel. Saya tahu kedengarannya agak tidak intuitif, tetapi setiap sampel keluaran (disebut bin) mewakili besarnya konten yang lebarnya (SAMPLING_FREQUENCY / FFT_POINTS) Hz.

MAGIC_SCALE hanyalah nilai untuk menskalakan data dan tidak memiliki dampak nyata saat Anda berurusan dengan ganda. Jika itu adalah DFFT yang menggunakan bilangan bulat 16 bit, Anda akan memiliki faktor penskalaan untuk memastikan input Anda tidak jenuh/meluap selama penghitungannya.

Perhatikan bahwa fungsi FFT tidak pernah diberi tahu apa itu SAMPLING_FREQUENCY atau MAGIC_SCALE.

Dalam kasus 44100, dan 1024, setiap nampan memiliki konten spektral ~43 Hz. Dalam kasus 16000, ~15Hz.

Jika 44100 berfungsi dan 16000 tidak, masalahnya mungkin ada pada kode yang mengelola variabel audioBuffer[] Anda.

person Russ Schultz    schedule 04.09.2015