Buku / sumber daya untuk mengimplementasikan berbagai fungsi matematika dalam aritmatika titik tetap untuk tujuan DSP

8

Saya mencari buku atau sumber daya yang mencakup hal-hal berikut secara detail:

  • menerapkan fungsi matematika (misalnya, logaritma, eksponensial, sinus, cosinus, terbalik) dalam aritmatika titik tetap untuk tujuan DSP.

  • teknik seperti menggunakan tabel pencarian, seri Taylor, dll.

Saya cukup akrab dengan pemrograman C dan lebih tertarik pada algoritma tentang bagaimana cara mengimplementasikan berbagai fungsi matematika secara efisien.

RuD
sumber
1
Ini hanya satu trik, tetapi sangat berguna. Ini tentang menghitung fungsi atan2, yaitu menghitung argumen dari bilangan kompleks dari bagian nyata dan imajinernya.
Matt L.
1
saya dapat memberi Anda beberapa rangkaian daya urutan terbatas yang dioptimalkan yang saya kembangkan lebih dari satu dekade lalu. selain klien awal, saya belum mendapatkan uang untuk itu sejak jadi saya pikir saya juga bisa membuatnya menjadi domain publik. awalnya ini dikembangkan untuk floating point dalam konteks di mana klien tidak dapat memasukkan stdlib dalam build. dan evaluasinya tidak terlalu sempurna. yaitu ada kesalahan, tetapi sangat kecil dan dioptimalkan untuk fungsi tertentu yang sedang dievaluasi. biar menemukan file itu, saya akan menarik koefisien dan memposting seri.
robert bristow-johnson
@ robertbristow-johnson saya berharap dapat menggunakan seri ini dan melihat bagaimana kelanjutannya! Terima kasih!
RuD
Ruchir, saya memposting seri di bawah ini. ada hal-hal yang masuk akal yang perlu Anda lakukan untuk memperluas jangkauan. seperti jika . hal serupa untuk dan sinusoid periodik. untuk exp dan log, ini akan memerlukan sedikit pergeseran aritmatika dari apa yang keluar (untuk exp) atau apa yang masuk (untuk log). saya pikir Anda bisa mengatasinya. dan, tentu saja, untuk exp dan log basis yang berbeda (seperti ), Anda hanya skala dengan konstanta yang sesuai apa yang masuk ke dan apa yang keluar dari .
2x=2k×2x-k
kxk+1catatan2()e2xcatatan2(x)
robert bristow-johnson

Jawaban:

9

bentuk polinomial umum adalah:

f(u)=n=0N an un=a0+(a1+(a2+(a3+...(aN2+(aN1+aNu)u)u ...)u)u)u

bentuk terakhir menggunakan metode Horner , yang sangat dianjurkan, terutama jika Anda melakukan ini dalam floating point presisi tunggal.

kemudian untuk beberapa fungsi spesifik:

akar pangkat dua:

f(x1)x1x2N=4a0=1.0a1=0.49959804148061a2=0.12047308243453a3=0.04585425015501a4=0.01076564682800

jika 2x4, gunakan di atas untuk mengevaluasi x2 dan gandakan hasilnya dengan 2 mendapatkan x. sepertilog2(x), terapkan kekuatan 2 scaling untuk skala argumen ke kisaran yang diperlukan.

logaritma basis 2:

xf(x1)log2(x)1x2N=5Sebuah0=1.44254494359510Sebuah1=-0.7181452567504Sebuah2=0.45754919692582Sebuah3=-0,27790534462866Sebuah4=0.121797910687826Sebuah5=-0,02584144982967

basis 2 eksponensial:

f(x)2x0x1N=4Sebuah0=1.0Sebuah1=0.69303212081966Sebuah2=0.24137976293709Sebuah3=0,05203236900844Sebuah4=0,01355574723481

sinus:

xf(x2)sin(π2x)1x1N=4a0=1.57079632679490a1=0.64596406188166a2=0.07969158490912a3=0.00467687997706a4=0.00015303015470

cosine (gunakan sinus):

cos(πx)=12sin2(π2x)

garis singgung:

tan(x)=sin(x)cos(x)

garis singgung terbalik:

xf(x2)arctan(x)1x1N=4a0=1.0a1=0.33288950512027a2=0.08467922817644a3=0.03252232640125a4=0.00749305860992

arctan(x)=π2arctan(1x)1x

arctan(x)=π2arctan(1x)x1

sinus terbalik:

arcsin(x)=arctan(x1x2)

cosinus terbalik:

arccos(x)=π2arcsin(x)=π2arctan(x1x2)
robert bristow-johnson
sumber
Itu sepertinya cukup berguna! Terima kasih banyak untuk membagikannya. Tapi entri referensi pertama tetap yang man soxterbaik;)
jojek
tak tahu sox. apa yang manual katakan tentang hal itu?
robert bristow-johnson
2
Cukup [1] R. Bristow-Johnson, Cookbook formulae for audio EQ biquad filter coefficients, http://musicdsp.org/files/Audio-EQ-Cookbook.txt:)
jojek
BTW, seri ini meminimalkan kesalahan tertimbang maksimum . kesalahan tertimbang sedemikian rupa sehingga masuk akal untuk fungsi tersebut. kesalahan maksimum seragam untukcatatan2(). kesalahan maksimum proporsional untukx dan 2x. sesuatu yang mirip dengan proporsional untukdosa() ada hubungannya dengan koefisien komputasi untuk filter resonan sehingga kesalahan maks catatan(f0)diminimalkan. saya tidak ingat kriteria apa yang saya gunakanArktan(). dan untuk beberapa alasan saya tidak dapat menemukan file saya yang memberi tahu saya apa kesalahan maksimum, mengingat kisaranx. seseorang dengan MATLAB dapat mengetahuinya.
robert bristow-johnson
1
Anda harus merencanakan kesalahan dengan python Anda, jika Anda bisa. juga np.max(np.abs(sqrt_1px(xp)-np.sqrt(1+xp)))mungkin sebaliknya np.max(np.abs((sqrt_1px(xp)-np.sqrt(1+xp))/np.sqrt(1+xp))) dan sama untuk 2**x pembobotan kesalahan karena dosa berbeda dan saya harus menemukan bagaimana saya melakukan itu. Saya punya skrip MATLAB lama yang digunakan untuk mengurutkan pekerjaan di Oktaf, tapi sekarang saya bahkan tidak bisa mendapatkan Oktaf untuk plot di laptop G4 Mac lama saya.
robert bristow-johnson
2

Meskipun tidak spesifik untuk titik tetap, saya akan sangat merekomendasikan buku "Math Toolkit for Real-Time Programming" karya Jack Crenshaw. Muncul dengan CD dengan kode sumber.

David
sumber
2

TI memiliki perpustakaan IQMath untuk semua mikrokontroler titik tetapnya. Saya telah menemukan mereka menjadi tambang emas fungsi fixed-point matematika dan DSP tidak harus terbatas pada chip TI.

MSP430 C28X

Otto Hunt
sumber
Saya lebih tertarik pada algoritma daripada hanya penerapan fungsi
RuD
1

Perkiraan Chebyshev dapat membantu menghitung koefisien polinomial yang mendekati optimal untuk memperkirakan suatu fungsi pada rentang terbatas. Anda menjalankan aproksimasi rutin pada PC untuk mencapai serangkaian koefisien polinomial tertentu, yang kemudian dapat Anda terapkan pada platform apa pun yang Anda suka (mis. Tertanam / DSP) Cetakan kecil kurang lebih adalah sebagai berikut:

  • Ini hanya berfungsi untuk fungsi satu variabel; jika Anda memiliki beberapa fungsiz=f(x,y) maka pendekatan Chebyshev tidak akan membantu Anda.
  • Fungsi yang Anda aproksimasi harus "polinomial-like". Sudut, tikungan tajam, dan banyak goyangan akan membutuhkan polinomial tingkat tinggi untuk mencapai tingkat akurasi tertentu.
  • Menjaga agar urutan polinomial rendah adalah penting - di atas 5 atau lebih, Anda mungkin mulai melihat kesalahan numerik.
  • Perkiraan Chebyshev menggunakan polinomial Chebyshev yang dievaluasi pada domain [-1,1], jadi jika rentang input untuk fungsi Anda sangat berbeda, Anda mungkin perlu mengukur / mengimbangi input dengan tepat sebelum menentukan koefisien dan sebelum menerapkannya. Misalnya, jika saya peduli dengan fungsi pada rentang inputx[0,20] maka saya mungkin mendefinisikan kamu=(x×0,1)-1 maka kamu berkisar dari -1 hingga +1 dan saya dapat mengevaluasi polinomial dalam kamuuntuk menghitung hasil yang diperlukan. Tanpa penskalaan ini, Anda dapat mengalami kesalahan numerik dengan lebih mudah - atau menyatakan dengan cara lain, untuk ketepatan yang sama Anda mungkin memerlukan panjang bit yang lebih tinggi untuk menghitung nilai antara, dan ini biasanya tidak diinginkan.
Jason S
sumber
Jason, saya tidak menggunakan polinomial Tchebyshev, tetapi saya memang menggunakan kesalahan MinMax tertimbang (kadang-kadang disebut "L.norma "pada kesalahan), yang, saya pikir, sama dengan pendekatan Tchebyshev. Metode yang saya gunakan adalah Remez Exchange Algorithm.
robert bristow-johnson
Remez lebih unggul (meskipun lebih kompleks) daripada Chebyshev. Chebyshev hanya mendekati kondisi minimax, tetapi biasanya itu cukup baik.
Jason S