Bagaimana menganalisis input / spektrum audio dengan benar


9

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.


2
Pertanyaan ini tampaknya di luar topik karena ini tentang array Java dasar, tipe data, dan membaca file.
hotpaw2

1
Mereka berkata saya harus bertanya di sini karena ini berkaitan dengan Pemrosesan Sinyal
user3241507

Tampaknya hanya bagian terakhir dari pertanyaan Anda tentang DSP. Coba hapus 2 atau 3 bagian pertama untuk menjadi topik di sini.
hotpaw2

Jawaban:


8

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.


5

Jika Anda cukup baik dengan JAVAAnda dapat menggunakan JTRANSFORMS perpustakaan java FFTyang dapat membantu Anda

dan dengan kebutuhan Anda itu terdengar seperti

masukkan deskripsi gambar di sini

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 ratekatakanlah Anda menggunakan sampling rate 8000 dan setiap sampel 16bit signed little endian, maka bingkai 20ms Anda akan menjadi 160 sampel

Catatan: cobalah memainkan rawfile bukan mp3file 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 absolutenilai 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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.