Saya mencoba memulai dengan DSP di papan Spartan-3 saya. Saya membuat papan AC97 dengan chip dari motherboard lama, dan sejauh ini saya mendapatkannya untuk melakukan ADC, gandakan sampel untuk angka <1 (turunkan volume) dan kemudian DAC.
Sekarang saya ingin melakukan beberapa hal dasar DSP, seperti filter low-pass, high-pass dll. Tapi saya benar-benar bingung tentang representasi numerik (integer? Titik tetap? Q0.15? Overflow atau saturation?).
Saya hanya ingin beberapa contoh kode filter sederhana aktual untuk memulai. Tidak ada efisiensi tinggi, cepat, atau semacamnya. Hanya filter teoritis yang diimplementasikan dalam VHDL.
Saya sudah mencari tetapi saya hanya menemukan formula teoritis - Saya mengerti, apa yang saya tidak mengerti adalah bagaimana memproses sampel audio 16-bit, 48KHz yang ditandatangani yang saya dapatkan dari ADC. Saya telah menggunakan perpustakaan ini: http://www.vhdl.org/fphdl/ . Jika saya mengalikan sampel saya dengan 0,5, 0,25, dll, saya bisa mendengar perbedaannya. Tetapi filter yang lebih besar memberi saya kebisingan.
Terima kasih.
Jawaban:
Kedengarannya Anda perlu mencari tahu aspek DSP terlebih dahulu, kemudian melakukan implementasi dalam FPGA.
Mengenai tipe data, Anda dapat menggunakan bilangan bulat dengan baik.
inilah beberapa contoh kode untuk membuat Anda pergi. Perhatikan bahwa ini kehilangan banyak masalah di dunia nyata (misalnya reset, manajemen overflow) - tapi mudah-mudahan ini bermanfaat:
sumber
Filter low pass FIR paling sederhana yang dapat Anda coba adalah y (n) = x (n) + x (n-1). Anda dapat menerapkan ini dengan cukup mudah di VHDL. Di bawah ini adalah diagram blok yang sangat sederhana dari perangkat keras yang ingin Anda implementasikan.
Menurut rumus, Anda memerlukan sampel ADC saat ini dan sebelumnya untuk mendapatkan hasil yang sesuai. Yang harus Anda lakukan adalah mengunci sampel ADC yang masuk di tepi jatuh jam, dan melakukan perhitungan yang sesuai pada tepi naik untuk mendapatkan output yang sesuai. Karena Anda menambahkan dua nilai 16-bit secara bersamaan, ada kemungkinan Anda akan mendapatkan jawaban 17-bit. Anda harus menyimpan input ke register 17-bit dan menggunakan adder 17-bit. Output Anda, bagaimanapun, akan menjadi 16 bit jawaban yang lebih rendah. Kode mungkin terlihat seperti ini, tetapi saya tidak dapat menjamin bahwa kode tersebut akan berfungsi sepenuhnya karena saya belum mengujinya, apalagi mensintesisnya.
Seperti yang Anda lihat, Anda dapat menggunakan ide umum ini untuk menambahkan formula yang lebih rumit, seperti yang memiliki koefisien. Rumus yang lebih rumit, seperti filter IIR, mungkin memerlukan penggunaan variabel untuk mendapatkan logika algoritma yang benar. Akhirnya, cara mudah untuk menyiasati filter yang memiliki bilangan real sebagai koefisien adalah menemukan faktor skala sehingga semua angka akhirnya sedekat mungkin dengan bilangan bulat. Hasil akhir Anda harus diperkecil oleh faktor yang sama untuk mendapatkan hasil yang benar.
Saya harap ini bisa berguna bagi Anda dan membantu Anda membuat bola bergulir.
* Ini telah diedit sehingga data latching dan output latching berada dalam proses yang terpisah. Juga menggunakan tipe bertanda bukan std_logic_vector. Saya berasumsi input ADC Anda akan menjadi sinyal std_logic_vector.
sumber
Cuplikan kode sederhana lainnya (hanya nyali). Catatan saya tidak menulis VHDL secara langsung, saya menggunakan MyHDL untuk menghasilkan VHDL.
Ini adalah implementasi langsung. Ini akan membutuhkan pengganda. Sintesis sirkuit ini, yang ditargetkan untuk Altera Cyclone III, tidak menggunakan pengganda eksplisit tetapi membutuhkan 350 elemen logika.
Ini adalah filter FIR kecil dan akan memiliki respons berikut (tidak terlalu bagus) tetapi harus bermanfaat sebagai contoh.
Selain itu saya punya beberapa contoh, di sini dan di sini , yang mungkin berguna.
Selain itu, pertanyaan Anda tampaknya bertanya: "representasi titik tetap apa yang tepat?" Seringkali ketika menerapkan fungsi DSP, representasi titik tetap digunakan, karena menyederhanakan menganalisis filter. Seperti yang disebutkan, fixed-point hanyalah integer artimetik. Implementasi yang sebenarnya hanya bekerja dengan bilangan bulat tetapi representasi yang kami buat bersifat fraksional.
Masalah biasanya muncul ketika mengkonversi dari bilangan bulat implementasi (titik tetap) ke / dari titik buntu desain.
Saya tidak tahu seberapa baik VHDL fixed-point dan tipe floating-point didukung. Mereka akan bekerja dengan baik dalam simulasi tetapi saya tidak tahu apakah mereka akan mensintesis dengan sebagian besar alat sintesis. Saya membuat pertanyaan terpisah untuk ini.
sumber
OpenCores memiliki sejumlah contoh DSP, IIR dan FIR, termasuk BiQuad. Anda harus mendaftar untuk mengunduh file.
sunting
Saya mengerti komentar Kortuk tentang tautan mati, dan memang, jika tautan ke OpenCores mati jawabannya tidak akan berguna. Saya cukup yakin bahwa ini tidak akan terjadi; tautan saya adalah yang umum, dan itu hanya akan mati jika domain OpenCores yang lengkap akan hilang.
Saya mencoba mencari beberapa contoh yang bisa saya gunakan untuk jawaban ini tetapi terlalu lama untuk diwakili di sini. Jadi saya akan tetap berpegang pada saran saya untuk mendaftar sendiri untuk situs (saya harus pindah ke New York, karena kota asal saya tidak diterima) dan melihat kode yang disajikan di sana.
sumber
Saya telah mencoba mengimplementasikan skrip untuk implementasi automatis filter IIR, di mana Anda dapat menentukan apakah desain harus secepat mungkin (sehingga setiap perkalian dilakukan dengan pengali khusus) atau sekecil mungkin (sehingga setiap pengali digunakan kembali).
Sumber-sumber tersebut telah dipublikasikan di alt.sources sebagai "Implementasi filter IIR yang dapat disiasati tetapi dapat disintesis di VHDL" (Anda juga dapat menemukannya di arsip google: https://groups.google.com/group/alt.sources/msg/c8cf038b9b8ceeec ? dmode = sumber )
Posting ke alt.source dalam format "shar", jadi Anda perlu menyimpan pesan sebagai teks, dan menghapusnya (dengan utilitas "unshar") untuk mendapatkan sumber.
sumber
Bagaimana dengan ini? https://github.com/MauererM/VIIRF
Ini mengimplementasikan filter IIR berbasis biquad (SOS, orde kedua) yang menangani implementasi titik tetap. Ini juga menampilkan skrip Python untuk desain dan verifikasi filter. Itu tidak menggunakan konstruksi FPGA khusus-Vendor dan Anda dapat memilih trade-off antara penggunaan area kecepatan tinggi dan rendah.
sumber