วิธีคำนวณจุด FFT จากอัตราการสุ่มตัวอย่างในการบันทึกเสียง

ฉันมีโค้ดตัวอย่างที่คงที่อัตราการสุ่มตัวอย่าง จุด fft ในการบันทึกเสียง รหัสนี้คือ

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);
        }
    }

รหัสนั้นใช้เพื่อบันทึกไฟล์ Raw จากการบันทึกเสียง อย่างไรก็ตาม ฉันต้องการเปลี่ยน SAMPLING_RATE เป็น 16000 ฉันสามารถใช้ FFT_POINTS เดิมคือ 1024 ได้ไหม ถ้าไม่ โปรดแนะนำวิธีคำนวณและ MAGIC_SCALE ให้ฉันด้วย ฉันพยายามใช้ค่านั้น แต่เสียงปรากฏเป็นเสียงรบกวน ขอบคุณ. ลิงก์อ้างอิงอยู่ที่นี่ที่นี่




คำตอบ (1)


อัลกอริธึม FFT ไม่สนใจอัตราการสุ่มตัวอย่าง ฉันรู้ว่าฟังดูไม่ค่อยเข้าใจง่าย แต่แต่ละตัวอย่างของเอาต์พุต (เรียกว่าถังขยะ) แสดงถึงขนาดของเนื้อหาที่มีความกว้าง (SAMPLING_FREQUENCY / FFT_POINTS) Hz

MAGIC_SCALE เป็นเพียงค่าในการปรับขนาดข้อมูล และไม่มีผลกระทบที่แท้จริงเมื่อคุณต้องรับมือกับจำนวนสองเท่า หากเป็น DFFT ที่ใช้จำนวนเต็ม 16 บิต คุณจะต้องมีปัจจัยสเกลเพื่อให้แน่ใจว่าอินพุตของคุณไม่อิ่มตัว/ล้นระหว่างการคำนวณ

โปรดสังเกตว่าฟังก์ชัน FFT ไม่เคยบอกว่า SAMPLING_FREQUENCY หรือ MAGIC_SCALE คืออะไร

ในกรณีของ 44100 และ 1024 แต่ละถังขยะจะมีเนื้อหาสเปกตรัมที่ ~43 Hz ในกรณีของ 16,000 จะเป็น ~15Hz

หาก 44100 ใช้งานได้ แต่ 16000 ไม่ได้ผล ปัญหาน่าจะอยู่ที่โค้ดที่จัดการตัวแปร audioBuffer[] ของคุณ

person Russ Schultz    schedule 04.09.2015