Bir FFT uygulamasını test etmek için hangi verileri kullanmalıyım ve hangi doğruluğu beklemeliyim?


14

Bir FFT algoritması uygulamak için bir çabaya katıldım ve giriş testi verilerinin kullanılması için önerilen tavsiyenin ne olduğunu ve nedenini merak ediyorum! - ve ne hassasiyet beklenir.

Test girişlerinde, eski Usenet yayınlarında cevap olarak göndereceğim küçük bir rehber buldum, ancak çok fazla gerekçe olmadan sadece bir kişinin önerileri - Sağlam bir cevap gibi görünen bir şey bulamadım.

Doğruluk açısından Wikipedia, hatanın O (e log N) olması gerektiğini söylüyor, ancak mutlak terimlerle makul bir beklenti nedir?

Eklemek için düzenleme: Gerçek testler karşılaştırmak için giriş veri dizileri ve önceden hesaplanmış "referans" çıkış verilerinin depolanmış bir formda, bu yüzden mutlaka kapalı form çözümü ile bir şey gerekmez.

Yanıtlar:


12

Bir FFT algoritmasını doğruluk için doğrulamak istiyorsanız , ayrık Fourier dönüşümünün bilinen özelliklerine sahip istenen işlevi yerine getirmesi bakımından, önerilen yaklaşımı kullanabilirsiniz:

Ergün, Funda. (1995, Haziran). Çok değişkenli doğrusal fonksiyonların test edilmesi: Jeneratör darboğazının aşılması. İn Proc. Yirmi Yedinci Ann. ACM Belirti. Hesaplama Teorisi . (s. 407-416).

Yukarıdaki makalede, belirli bir FFT uygulamasının yapılması gerekeni yaptığını doğrulamak için tercih ettikleri yöntem olarak FFTW yapımcıları tarafından atıfta bulunulmaktadır. Önerilen teknik, işlevi ayrı testlerle doğrulanan üç ana bileşene ayırır:

  • a1,a2,x1[n],x2[n]

FFT(a1x1[n]+a2x2[n])=a1FFT(x1[n])+a2FFT(x2[n])
  • Birim impulsun DFT'si: FFT algoritmasının girişine Kronecker delta fonksiyonuna eşit bir zaman alanı sinyali uygulanır ve çıktı, ünite impuls fonksiyonunun bilinen DFT'sine göre kontrol edilir (tüm çıkışlarda sabit bir değere dönüşür depo). FFT algoritması bir IFFT sağlıyorsa, ünite impuls işlevini tekrar verdiğini göstermek için tersine test edilebilir.

  • Zaman kaydırma: FFT algoritmasının girişine iki veri seti uygulanır; zaman alanındaki ikisi arasındaki tek fark, sabit bir zaman kaymasıdır. DFT'nin bilinen özelliklerine dayanarak, bu, iki sinyalin frekans alanı gösterimleri arasındaki bilinen bir doğrusal faz kaymasını etkilemelidir; burada faz kaymasının eğimi, zaman kayması ile orantılıdır.

Makalenin yazarları, bu testlerin bir FFT uygulamasının doğruluğunu doğrulamak için yeterli olduğunu iddia etmektedir. Bu tekniği geçmişte kullanmadım, ama mantıklı görünüyor ve doğrulama sorununa iyi yaklaşımlar konusunda güvenilir otoriteler olarak FFTW'nin yazarlarına (büyük bir özgür yazılım parçası üreten) güvenirim.


Teşekkürler! Yazarlar, doğrusallık testinde kullanılacak a1, a2, x1 [n] ve x2 [n] değerleri için herhangi bir öneri var mı (veya bunun büyük ölçüde önemli olmadığını iddia ediyorlar)? Ve bu nedenle, veri seti için zaman kaydırma testi için kullanılacak?
Brooks Moses

3
Makaleyi gerçekten okuduktan sonra kendi sorumu cevaplayabilirim: Yazarlar kişinin doğrusallık testini nasıl gerçekleştirdiğini anlatmazlar, bunun yerine "çoğu girdi" için doğru olduğunu kanıtlamak için yeterli olduğunu varsayarlar. Ayrıca, bu makale kesin aritmetik varsayımıyla kesin doğruluk kanıtı tanımlamaktadır; yaklaşık bir programda sayısal hatayı karakterize etmek için bir araç tanımlamamaktadır (zorunlu olarak sonlu duyarlıklı aritmetik kullanımından kaynaklanmaktadır).
Brooks Moses

Devam edip bunu kabul edilmiş olarak işaretleyeceğim, çünkü bu şimdiye kadarki en iyi cevap - ama yine de hangi test giriş verilerinin (ve neden) kullanılacağını (ve nedenini) veya beklenen doğruluk ayrıntılarını kapsayan diğer cevaplarla ilgileniyorum. . Teşekkürler!
Brooks Moses

2
Bir FFT algoritmasını doğrulama konusunda sorunuzun gerçekten iki bileşeni vardır: doğruluğunu doğrulama ve sayısal doğruluğunu ölçme. Cevabım sadece ilkine hitap etti. Doğası gereği uygulamaya bağlı olduğu için hangi sayısal doğruluktan bekleneceği konusunda herhangi bir açıklama yapmak zordur. Aritmetik türü (örneğin sabit ve kayan noktaya karşı sabit), algoritmayı uygulamak için kullanılan yapı, FFT uzunluğu (yani problemi ayrıştırmak için kullanılan aşama sayısı), yürütme hızını iyileştirmek için alınan kısayolların tümü, ve genellemesi zordur.
Jason R

İyi bir nokta; Muhtemelen bunları ayrı sorular olarak sormalıydım.
Brooks Moses

5

Soruda belirtildiği gibi, arşivlenmiş comp.dsp Usenet yayınlarında ( http://www.dsprelated.com/showmessage/71595/1.php , "tdillon" tarafından gönderilen) bir dizi öneri buldum:

A.Single FFT tests - N inputs and N outputs
 1.Input random data
 2.Inputs are all zeros
 3.Inputs are all ones (or some other nonzero value)
 4.Inputs alternate between +1 and -1.
 5.Input is e^(8*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 6.Input is cos(8*2*pi*i/N) for i = 0,1,2, ...,N-1.
 7.Input is e^((43/7)*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 8.Input is cos((43/7)*2*pi*i/N) for i = 0,1,2, ...,N-1.

B.Multi FFT tests - run continuous sets of random data
 1.Data sets start at times 0, N, 2N, 3N, 4N, ....
 2.Data sets start at times 0, N+1, 2N+2, 3N+3, 4N+4, ....

İplik ayrıca biri büyük genlikli, diğeri küçük genlikli iki sinüs yapmayı önerir.

Ana soruda söylediğim gibi, bunun özellikle iyi bir cevap seti olup olmadığından emin değilim, ya da çok eksiksizse, ama insanların oy verebilmesi ve yorum yapabilmesi için buraya koyuyorum.


1
"1. Rastgele veri girin" ne gösterir?
Dilip Sarwate

1
@DilipSarwate: Fuzz testi, çökmeleri ortaya çıkarmak için yararlı olabilir. Ayrıca, gürültü girişinin türüne (örneğin pembe gürültü veya beyaz gürültü) bağlı olarak, toplam enerji dağılımının beklendiği gibi olup olmadığının kontrol edilmesinde yararlı olabilir.
smokris

2
@Dilip - Benim fft "duman testi" ifft (fft (random_stuff)) ~ = random_stuff olduğunu.
hotpaw2

NCN(0,1)99%N CN(0,1)

2
@Dilip: Ben bir donanımcıyım. Tüm çarpanlarda ve CSA'larda tüm bitlerin yüksek bir yüzdesini değiştirebilecek bir şey istedim.
hotpaw2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.