Saya cukup baru untuk Java dan Pemrosesan Sinyal, tetapi saya ditugaskan proyek yang berurusan dengan pemrosesan audio. Topik saya yang diberikan kepada saya adalah permainan yang memiliki komponen menganalisis lagu (lagu apa pun) dan menampilkan data tergantung pada frekuensi yang sedang diputar (waktu nyata). yaitu: ketika lagu diputar, output frekuensi saat ini (setiap detik output frekuensi saat ini).
Saya telah diberitahu tentang stackoverflow untuk menggunakan FFT. mereka mengatakan "lakukan saja FFT" tetapi itu tidak ada artinya bagi saya? BAGAIMANA Anda melakukan FFT? Saya telah membaca tutorial, dan pada dasarnya mengerti apa itu, tetapi tidak tahu bagaimana menerapkannya seperti pada:
- apa tipe data file audio yang paling cocok untuk pemrosesan seperti itu?
- apa sebenarnya input dari FFT
- bagaimana cara menginterpretasikan hasil
Adakah yang bisa menyarankan langkah mudah untuk mengikuti / tutorial tentang cara memproses sinyal audio? Selain itu, jika ada yang tahu implementasi FFT yang baik untuk Java, saya akan sangat menghargai saran tersebut.
Jawaban:
Ayo lihat. Saya tidak tahu tentang kelas Java atau jenis dukungan apa yang dimilikinya untuk pemrosesan sinyal, tetapi saya akan memberikan Anda beberapa panduan. Rincian khusus dari implementasi dalam bahasa, Anda harus mencari tahu.
Untuk melakukan segala jenis pemrosesan pada file audio Anda memerlukan data "mentah", artinya file audio yang memiliki sampel audio yang tidak terkompresi. Untuk exmaple, format WAV, yang biasanya memiliki sampel dalam pelengkap 2bit bertanda 2
Jika Anda akan menggunakan komputer dan melakukan pemrosesan offline, mungkin ide yang bagus untuk memberikan nilai tersebut menjadi dua kali lipat (yang dalam kebanyakan prosesor saat ini berarti angka floating point 64bit).
Oleh karena itu Anda akan memiliki aliran nomor ganda yang berkelanjutan dari file. Maka Anda perlu menentukan cara untuk menangani data kontinu. Cara standar yang sangat banyak digunakan adalah dengan menggunakan buffer bundar (walaupun offline, saya berasumsi Anda ingin kode Anda menjadi efisien, dan memuat seluruh file ke memori sebagai array bukan solusi terbaik). Entah itu atau hanya penyangga biasa, adalah pilihan Anda. Panjang buffer harus menjadi kekuatan 2 (Lakukan untuk efisiensi algoritma Cooley-Tukey radix-2).
Sekarang Anda perlu melakukan FFT yang sebenarnya. Ini hanyalah sebuah multiplicacion dari buffer (yang secara matematis adalah vektor) oleh matriks FFT. Bagaimana operasi ini sebenarnya dilakukan di Jawa, tidak tahu. Dalam C itu hanya akan melewatkan pointer ke array dan panjang ke rutin FFT yang, baik mengembalikan pointer ke memori yang dialokasikan secara dinamis, atau meninggalkan hasilnya dalam array yang Anda lewati.
akhirnya, Anda sampai pada array bilangan kompleks M (Asumsikan panjang array / buffer / vektor dengan sinyal M). Dan kemudian Anda melakukan apa pun yang Anda inginkan dengannya.
Sebagai contoh, Anda dapat mengambil besarnya masing-masing bilangan kompleks, dan menemukan maksimum, untuk mendeteksi di mana frekuensi dasar dapat (meskipun sangat perkiraan).
Ekstra: Teknik yang lebih maju untuk diproses akan mencakup pra windowing untuk menghindari kebocoran, melakukan zero-padding untuk mendapatkan lebih banyak resolusi pada spektrum windowed, dll.
Semoga Membantu.
sumber
Jika Anda cukup baik dengan
JAVA
Anda dapat menggunakan JTRANSFORMS perpustakaan javaFFT
yang dapat membantu Andadan dengan kebutuhan Anda itu terdengar seperti
Visualisasi Musik menggunakan Java Sound API
Visualisasi Musik menggunakan FFT di Ruby di 7Steps
Anda dapat mengikuti langkah-langkah sederhana ini sesuai kebutuhan Anda:
* Biasakan beberapa terminologi audio
1. Baca Frame Bermain (Katakanlah 20-30ms), ukuran bingkai Anda tergantung pada Anda
sampling rate
katakanlah Anda menggunakan sampling rate 8000 dan setiap sampel16bit
signed
little endian
, maka bingkai 20ms Anda akan menjadi 160 sampelCatatan: cobalah memainkan
raw
file bukanmp3
file terkompresi .2. Ambil Bingkai Data Mentah dan Lakukan a
FFT
3. Lakukan Yang Benar
Windowing
4. output FFT hasil Anda akan memiliki dua komponen nyata dan kompleks mencoba untuk mengambil plot besarnya dari itu yang hanya
absolute
nilai komponen kompleks, puncak Anda memberi Andadominant frequency
5. lihat tutorial sederhana seperti di bawah ini
Tutorial yang bagus tentang FFT
Panduan Insinyur untuk FFT
Tutorial FFT
OverView dari FFT
sumber