Fourier dönüşümünün sinyal işlemede pratik uygulaması. ARM7 mikrokontrolörlerinde dijital sinyal işleme Fourier dönüşümü avr

Fourier teoremi, herhangi bir sinyalin, periyodik sinyalin frekansının katları olan frekanslara sahip ortonormal periyodik fonksiyonlar (örneğin sinüsler ve kosinüsler) kümesindeki bir seriye genişletilebileceğini belirtir. Bu nedenle, bir sinyalin spektral analizi, modülü tüm harmoniklerin genel süperpozisyonuna dahil edilen karşılık gelen harmoniğin salınım gücünün fraksiyonuna karşılık gelen ağırlıklandırma katsayılarının (genel durumda karmaşık olanlar) araştırılmasına dayanır. .

Hızlı Fourier Dönüşümü

Hızlı Fourier Dönüşümü, ayrık Fourier dönüşümünde (DFT) gereksiz hesaplamaları önlemek için trigonometrik fonksiyonların periyodiklik özelliklerinden başarıyla yararlanan ve böylece Fourier genişletmesinde katsayıların bulunmasını daha hızlı hale getiren bir hesaplama algoritmasıdır. Ayrık dönüşümden temel fark, sinyal işlemenin kendisinde değil, yalnızca sayısal değerlerin (algoritma) hesaplanması yöntemindedir. Hem FFT hem de DFT durumunda hesaplamaların sonucu aynıdır. FFT algoritması için tek gereklilik, L'nin herhangi bir pozitif tam sayı olduğu N = 2L'nin katı olan bir örnek boyutudur. En yaygın 2 tabanlı FFT algoritmaları şunlardır: zaman azaltımlı ve frekans azaltımlı.

Bu çalışmada zaman inceltme özelliğine sahip bir radix-2 FFT algoritması (Cooley-Tukey algoritması) uygulanmıştır. Bazı DFT yasalarını inceleyerek elde etmek kolaydır. Sözde dönme katsayısını tanıtalım:

Bu durumda DFT'de bir dizi sinyal değeri (f0,f1,…,fN-1) için Fourier katsayıları şu ilişkiyle ifade edilir:

4 değerden oluşan bir sinyal serisini düşünün: (f0,f1,f2,f3). Fourier dönüşümünü matris biçiminde sunalım (normalleştirme katsayısı 1/N, ifadenin sağ tarafındaki Cij sütun vektörüne dahil edilir):

Euler formülünü kullanarak dönme katsayılarını yazdıktan ve k = 0, 1, 2,.. 9 için değerlerini belirledikten sonra, tekrarlanan katsayıların modelinin görülebileceği bir diyagram (Şekil 2) oluşturabilirsiniz.

Şekil 2. N=4 için kuvvet serisi w

Sayısal değerleri (4)'te değiştirerek şunu elde ederiz:

Yani w4'ten başlayan w değerleri, w0'dan w3'e karşılık gelen değere eşittir. Daha sonra, matris denklemini (4) standart olmayan bir biçimde yeniden yazıyoruz (daha sonraki işlemlerin netliği için benzer gösterimler eklenmiştir):

Matrisin sütunlarını değiştirip iki gruba ayıralım: çift f0, f2 ve tek f1, f3 endekslerine göre:

wk+1 = wkw1 olduğunu dikkate alırsak ifade (6) şu şekilde yeniden yazılacaktır:

Oranları kullanarak:

Gerekli genişleme katsayılarını hücre değerlerine sahip bir sütun vektörü biçiminde elde ederiz:

Algoritmanın grafiksel gösterimi (Şekil 3) kanatları açık bir kelebeğe benzemektedir, bu nedenle bu hesaplama yöntemine “kelebek” adı verilmektedir.

Şekil 3. 4 terimlik bir seri için kelebek grafiği

Yani algoritmanın ilk adımında bir dizi sinyal değerinin üyeleri çift ve tek endekslere bölünür. Daha sonra “kelebek” grafiği yürütülür, iki aşamadan oluşur, sayıları örneklem büyüklüğünün ikisinin kuvvetine eşittir (N = 4 = 22). Her aşamada iki "kelebek" gerçekleştirilir ve toplam sayıları değişmeden kalır. Her kelebek işlemi bir çarpma işlemine karşılık gelir. Karşılaştırma için: örneklemeli (f0,f1,f2,f3) DFT'de çarpma işleminin 4×4 = 16 kez, FFT durumunda ise yalnızca 4 kez gerçekleştirilmesi gerekir.

Bu seri şu şekilde de yazılabilir:

(2),
burada , k-inci kompleksin genliği.

Katsayılar (1) ve (3) arasındaki ilişki aşağıdaki formüllerle ifade edilir:

Fourier serisinin tüm bu üç gösteriminin tamamen eşdeğer olduğuna dikkat edin. Bazen Fourier serileriyle çalışırken sinüs ve kosinüsler yerine hayali argümanın üslerini kullanmak, yani Fourier dönüşümünü karmaşık biçimde kullanmak daha uygundur. Ancak Fourier serisinin karşılık gelen genlik ve fazlarla birlikte kosinüslerin toplamı olarak sunulduğu formül (1)'i kullanmak bizim için uygundur. Her durumda, gerçek bir sinyalin Fourier dönüşümünün karmaşık harmonik genliklerle sonuçlanacağını söylemek yanlıştır. Wiki'nin doğru bir şekilde söylediği gibi, "Fourier dönüşümü (?), gerçek bir değişkenin bir fonksiyonunu başka bir fonksiyonla, yine bir gerçek değişkenle ilişkilendiren bir işlemdir."

Toplam:
Sinyallerin spektral analizinin matematiksel temeli Fourier dönüşümüdür.

Fourier dönüşümü, (0, T) segmentinde tanımlanan sürekli bir f(x) (sinyal) fonksiyonunu, belirli bir değerle sonsuz sayıda (sonsuz seri) trigonometrik fonksiyonun (sinüs ve/veya kosinüs) toplamı olarak temsil etmenize olanak tanır. (0, T) segmentinde de dikkate alınan genlikler ve fazlar. Böyle bir seriye Fourier serisi denir.

Fourier dönüşümünün sinyal analizine doğru uygulanması için anlaşılması gereken bazı noktalara daha değinelim. X ekseninin tamamındaki Fourier serisini (sinüsoidlerin toplamı) düşünürsek, (0, T) segmentinin dışında Fourier serisiyle temsil edilen fonksiyonun periyodik olarak fonksiyonumuzu tekrarlayacağını görebiliriz.

Örneğin, Şekil 7'deki grafikte, orijinal fonksiyon (-T\2, +T\2) segmentinde tanımlanır ve Fourier serisi, tüm x ekseninde tanımlanan periyodik bir fonksiyonu temsil eder.

Bunun nedeni sinüzoidlerin kendilerinin periyodik fonksiyonlar olmasıdır ve buna göre toplamları da periyodik bir fonksiyon olacaktır.


Şekil 7 Periyodik olmayan bir orijinal fonksiyonun Fourier serisi ile temsili

Böylece:

Orijinal fonksiyonumuz süreklidir, periyodik değildir ve T uzunluğunun belirli bir parçası üzerinde tanımlanmıştır.
Bu fonksiyonun spektrumu ayrıktır, yani sonsuz bir harmonik bileşen serisi (Fourier serisi) şeklinde sunulur.
Aslında Fourier serisi, (0, T) segmentinde bizimkiyle çakışan belirli bir periyodik fonksiyonu tanımlar, ancak bizim için bu periyodiklik önemli değildir.

Harmonik bileşenlerin periyotları, üzerinde orijinal f(x) fonksiyonunun tanımlandığı segmentin (0, T) değerinin katlarıdır. Başka bir deyişle harmonik periyotlar sinyal ölçüm süresinin katlarıdır. Örneğin Fourier serisinin birinci harmoniğinin periyodu, f(x) fonksiyonunun tanımlandığı T aralığına eşittir. Fourier serisinin ikinci harmoniğinin periyodu T/2 aralığına eşittir. Ve böyle devam eder (bkz. Şekil 8).


Şekil 8 Fourier serisinin harmonik bileşenlerinin periyotları (frekansları) (burada T = 2?)

Buna göre harmonik bileşenlerin frekansları 1/T'nin katlarıdır. Yani, Fk harmonik bileşenlerinin frekansları Fk = k\T'ye eşittir, burada k 0 ile ? arasında değişir, örneğin k = 0 F0 = 0; k=1 F1=1\T; k=2 F2=2\T; k=3 F3=3\T;… Fk= k\T (sıfır frekansta - sabit bileşen).

Orijinal fonksiyonumuz T=1 saniye boyunca kaydedilen bir sinyal olsun. O zaman ilk harmoniğin periyodu sinyalimizin süresine eşit olacak T1=T=1 sn ve harmonik frekansı 1 Hz olacaktır. İkinci harmoniğin periyodu sinyal süresinin 2'ye bölünmesine eşit olacak (T2=T/2=0,5 sn) ve frekansı 2 Hz olacaktır. Üçüncü harmonik için T3=T/3 sn ve frekans 3 Hz'dir. Ve benzeri.

Bu durumda harmonikler arasındaki adım 1 Hz'dir.

Böylece süresi 1 saniye olan bir sinyal, 1 Hz frekans çözünürlüğüne sahip harmonik bileşenlere ayrıştırılabilir (bir spektrum elde edilebilir).
Çözünürlüğü 2 kat artırarak 0,5 Hz'ye çıkarmak için ölçüm süresini 2 kat (2 saniyeye kadar) artırmanız gerekir. 10 saniye süren bir sinyal, 0,1 Hz frekans çözünürlüğü ile harmonik bileşenlere (bir spektrum elde etmek için) ayrıştırılabilir. Frekans çözünürlüğünü artırmanın başka yolu yoktur.

Örnek dizisine sıfırlar ekleyerek bir sinyalin süresini yapay olarak artırmanın bir yolu vardır. Ancak gerçek frekans çözünürlüğünü arttırmaz.

3. Ayrık sinyaller ve ayrık Fourier dönüşümü

Dijital teknolojinin gelişmesiyle birlikte ölçüm verilerinin (sinyallerin) saklanma yöntemleri de değişti. Daha önce bir sinyal bir kayıt cihazına kaydedilip analog biçimde bantta saklanabiliyorsa, artık sinyaller sayısallaştırılıyor ve bir dizi sayı (örnek) halinde bilgisayar belleğindeki dosyalarda saklanıyor.

Bir sinyali ölçmek ve sayısallaştırmak için genel şema aşağıdaki gibidir.


Şekil 9 Ölçüm kanalının şeması

gelen sinyal ölçüm dönüştürücü ADC'ye T süresi boyunca ulaşır. T süresi boyunca elde edilen sinyal örnekleri (örnekleme) bilgisayara aktarılır ve hafızada saklanır.


Şekil 10 Sayısallaştırılmış sinyal - T süresi boyunca alınan N örnek

Sinyal sayısallaştırma parametrelerinin gereksinimleri nelerdir? Giriş analog sinyalini ayrı bir koda dönüştüren bir cihaz ( dijital sinyal) analogdan dijitale dönüştürücü (ADC, İngilizce Analogdan dijitale dönüştürücü, ADC) (Wiki) olarak adlandırılır.

ADC'nin ana parametrelerinden biri, maksimum örnekleme frekansıdır (veya örnekleme hızı, İngilizce örnekleme hızı) - zaman sürekli bir sinyalin örnekleme sırasında örnekleme hızı. Hertz cinsinden ölçülür. ((Wiki))

Kotelnikov teoremine göre, sürekli bir sinyalin spektrumu Fmax frekansıyla sınırlıysa, zaman aralıklarında alınan ayrık örneklerden tamamen ve net bir şekilde yeniden oluşturulabilir. yani Fd frekansı ile? 2*Fmax, burada Fd örnekleme frekansıdır; Fmax - sinyal spektrumunun maksimum frekansı. Yani sinyal sayısallaştırma frekansının (ADC örnekleme frekansı), ölçmek istediğimiz sinyalin maksimum frekansından en az 2 kat daha yüksek olması gerekir.

Kotelnikov teoreminin gerektirdiğinden daha düşük frekanslı örnekler alırsak ne olur?

Bu durumda, yüksek frekanslı bir sinyalin dijitalleştirmeden sonra gerçekte var olmayan düşük frekanslı bir sinyale dönüştüğü "örtüşme" etkisi (stroboskopik etki, hareli etkisi olarak da bilinir) ortaya çıkar. İncirde. 5 kırmızı yüksek frekanslı sinüs dalgası gerçek bir sinyaldir. Daha düşük frekanslı mavi sinüzoid, örnekleme süresi boyunca yüksek frekanslı sinyal periyodunun yarısından fazlasının geçmesi için zamana sahip olması nedeniyle ortaya çıkan hayali bir sinyaldir.


Pirinç. 11. Yeterince yüksek örnekleme oranında yanlış düşük frekanslı sinyalin ortaya çıkması

Örtüşme etkisini önlemek için, ADC'nin önüne özel bir kenar yumuşatma filtresi yerleştirilir - ADC örnekleme frekansının yarısının altındaki frekansları geçiren ve daha yüksek frekansları kesen bir alçak geçiş filtresi (LPF).

Ayrık örneklerden bir sinyalin spektrumunu hesaplamak için ayrık Fourier dönüşümü (DFT) kullanılır. Ayrı bir sinyalin spektrumunun "tanımı gereği" örnekleme frekansının (Fd) yarısından daha az olan Fmax frekansıyla sınırlı olduğunu bir kez daha belirtelim. Bu nedenle, spektrumu sınırsız olabilen sürekli bir sinyalin Fourier serisinin sonsuz toplamının aksine, ayrı bir sinyalin spektrumu, sonlu sayıda harmoniğin toplamı ile temsil edilebilir. Kotelnikov teoremine göre, bir harmoniğin maksimum frekansı, en az iki örneği hesaba katacak şekilde olmalıdır, bu nedenle harmoniklerin sayısı, ayrı bir sinyalin örnek sayısının yarısına eşittir. Yani, numunede N adet örnek varsa spektrumdaki harmoniklerin sayısı N/2'ye eşit olacaktır.

Şimdi ayrık Fourier dönüşümünü (DFT) ele alalım.

Fourier serileriyle karşılaştırıldığında

DFT'deki zamanın doğası gereği ayrı olması ve harmoniklerin sayısının N/2 (örnek sayısının yarısı) ile sınırlı olması dışında bunların çakıştığını görüyoruz.

DFT formülleri boyutsuz tamsayı değişkenleri k, s olarak yazılır; burada k sinyal örneklerinin sayısıdır, s ise spektral bileşenlerin sayısıdır.
s değeri, T periyodundaki (sinyal ölçüm süresi) tam harmonik salınımların sayısını gösterir. Ayrık Fourier dönüşümü, sayısal bir yöntem kullanarak harmoniklerin genliklerini ve fazlarını bulmak için kullanılır; "bilgisayarda"

Başlangıçta elde edilen sonuçlara geri dönelim. Yukarıda bahsedildiği gibi, periyodik olmayan bir fonksiyonu (sinyalimiz) bir Fourier serisine genişlettiğimizde, ortaya çıkan Fourier serisi aslında T periyoduna sahip periyodik bir fonksiyona karşılık gelir (Şekil 12).


Şekil 12 T0 periyodu, T>T0 ölçüm periyodu ile periyodik fonksiyon f(x)

Şekil 12'de görülebileceği gibi f(x) fonksiyonu T0 periyoduyla periyodiktir. Ancak T ölçüm örneğinin süresinin T0 fonksiyonunun periyoduna uymaması nedeniyle Fourier serisi olarak elde edilen fonksiyon T noktasında süreksizliğe sahiptir. Sonuç olarak bu fonksiyonun spektrumu şunları içerecektir: çok sayıda yüksek frekanslı harmonik. T ölçüm örneğinin süresi, T0 fonksiyonunun periyoduyla çakışırsa, Fourier dönüşümünden sonra elde edilen spektrum, f(x) fonksiyonundan dolayı yalnızca ilk harmoniği (örnekleme süresine eşit bir periyoda sahip sinüzoid) içerecektir. bir sinüzoiddir.

Başka bir deyişle, DFT programı sinyalimizin bir "sinüzoid parçası" olduğunu "bilmiyor", ancak bireysel parçaların tutarsızlığından dolayı süreksizliği olan periyodik bir fonksiyonu bir seri şeklinde temsil etmeye çalışıyor. bir sinüzoid.

Sonuç olarak spektrumda, bu süreksizlik de dahil olmak üzere fonksiyonun şeklini özetlemesi gereken harmonikler ortaya çıkar.

Bu nedenle, farklı periyotlara sahip birkaç sinüzoidin toplamı olan bir sinyalin "doğru" spektrumunu elde etmek için, her sinüzoidin periyotlarının tam sayısının sinyal ölçüm periyoduna uyması gerekir. Pratikte bu koşul, yeterince uzun bir sinyal ölçümü süresi boyunca karşılanabilir.


Şekil 13 Şanzıman kinematik hata sinyalinin fonksiyonu ve spektrumu örneği

Daha kısa bir süre ile resim “daha ​​kötü” görünecektir:


Şekil 14 Rotor titreşim sinyalinin fonksiyonu ve spektrumu örneği

Uygulamada, "gerçek bileşenlerin" nerede olduğunu ve bileşenlerin çoklu olmayan periyotlarından kaynaklanan "yapıların" nerede olduğunu ve sinyal örnekleme süresinin veya sinyal şeklindeki "sıçramaların ve kırılmaların" nerede olduğunu anlamak zor olabilir. . Elbette "gerçek bileşenler" ve "yapıtlar" kelimelerinin tırnak içine alınmasının bir nedeni var. Spektrum grafiğinde çok sayıda harmoniğin bulunması, sinyalimizin aslında bunlardan “oluştuğu” anlamına gelmez. Bu, 7 sayısının 3 ve 4 sayılarından "oluştuğunu" düşünmekle aynı şeydir. 7 sayısı, 3 ve 4 sayılarının toplamı olarak temsil edilebilir - bu doğrudur.

Yani sinyalimiz... veya daha doğrusu "bizim sinyalimiz" değil, sinyalimizin tekrarından oluşan periyodik bir fonksiyon (örnekleme), belirli genlik ve fazlara sahip harmoniklerin (sinüs dalgaları) toplamı olarak temsil edilebilir. Ancak pratik için önemli olan birçok durumda (yukarıdaki şekillere bakın), spektrumda elde edilen harmonikleri doğası gereği döngüsel olan ve sinyal şekline önemli bir katkı sağlayan gerçek süreçlerle ilişkilendirmek gerçekten mümkündür.

Bazı sonuçlar

1. Bir ADC tarafından sayısallaştırılan, yani bir dizi ayrı örnekle (N parça) temsil edilen, T saniye süresine sahip gerçek ölçülen bir sinyal, bir dizi harmonikle (N/) temsil edilen ayrı bir periyodik olmayan spektruma sahiptir. 2 parça).

2. Sinyal bir dizi gerçek değerle temsil edilir ve spektrumu bir dizi gerçek değerle temsil edilir. Harmonik frekanslar pozitiftir. Matematikçiler için spektrumu negatif frekanslar kullanarak karmaşık biçimde temsil etmenin daha uygun olması, “bu doğrudur” ve “bu her zaman yapılmalıdır” anlamına gelmez.

3. T zaman aralığında ölçülen bir sinyal yalnızca T zaman aralığında belirlenir. Sinyali ölçmeye başlamadan önce ne olduğu ve bundan sonra ne olacağı bilim tarafından bilinmemektedir. Ve bizim durumumuzda bu ilginç değil. Zaman sınırlı bir sinyalin DFT'si, belirli koşullar altında bileşenlerinin genliğini ve frekansını hesaplamaya izin vermesi anlamında "gerçek" spektrumunu verir.

Kullanılan malzemeler ve diğer faydalı malzemeler.

Görüntüleme cihazı olarak iki satır karakterli LCD gösterge kullanılır. Bu projenin uygulanmasındaki ana nokta donanım değil, yazılımdır, daha doğrusu ayrık Fourier dönüşümünün (DFT) 8 bitlik bir mikro denetleyici üzerinde uygulanmasıdır. Yazarın bu alanda uzman olmadığı ve bu nedenle temel bilgilerle, basit bir ayrık Fourier dönüşümüyle başladığı hemen belirtilmelidir. Hızlı Fourier dönüşümü algoritması sadece hızlı değil aynı zamanda oldukça karmaşıktır.

Ayrık Fourier Dönüşümü (İngiliz literatüründe DFT, Ayrık Fourier Dönüşümü), dijital sinyal işleme algoritmalarında yaygın olarak kullanılan Fourier dönüşümlerinden biridir (modifikasyonları MP3'te ses sıkıştırmada, JPEG'de görüntü sıkıştırmada vb. kullanılır) ve ayrıca ayrık (örneğin sayısallaştırılmış analog) bir sinyaldeki frekansların analizi ile ilgili diğer alanlar. Ayrık Fourier dönüşümü, girdi olarak ayrık bir işlev gerektirir. Bu tür işlevler genellikle örnekleme (sürekli işlevlerden değerlerin örneklenmesi) yoluyla oluşturulur.

Bir spektrum analizörünün şematik diyagramı ses sinyaliçok basittir ve kabaca dijital ve analog parçalara ayrılabilir.

Dijital kısım bir mikrodenetleyici ve ona bağlı bir LCD göstergeden oluşur. Mikrodenetleyicinin saat ayarı şu şekildedir: kuvars rezonatör 16 MHz, mikro denetleyicinin ADC'si için referans voltajı olarak +5 V besleme voltajı kullanılır.
LCD göstergesinin veri yolu mikro denetleyicinin C portuna (giriş/çıkış hatları PC0-PC3) bağlanır, kontrol veri yolu ise mikro denetleyicinin D portuna (PD5, PD6) bağlanır. Gösterge 4 bit modunda çalışır. Kontrastı ayarlamak için nominal değeri 4,7 kOhm olan değişken bir direnç kullanılır. Göstergeyle çalışmak için, analizörün 8 yatay sütununu görüntüleyecek özel semboller oluşturuldu; bu özel semboller, LCD göstergesinin 64 Bayt RAM'inin tamamını kaplar.

Mikrodenetleyici harici bir 16 MHz kuvars rezonatöründen çalışır.

Cihazın analog kısmı en önemli kısımdır ve çıkışı mikro denetleyicide yerleşik ADC'nin ADC0 kanalına bağlanan elektret mikrofon sinyalinin bir ön amplifikatörüdür. ADC girişindeki sıfır seviyesini referans voltajının tam yarısına ayarlamamız gerekiyor, yani. 2,5 V. Bu durumda sinyalin pozitif ve negatif yarım dalgasını kullanabiliriz, ancak genliği belirlenen sınırı aşmamalıdır, yani. Aşırı yüklemeyi önlemek için kazanç ince ayarlanmalıdır. Yukarıdaki koşulların tümü, ortak bir düşük güçlü işlemsel yükselteç mikro devresi tarafından karşılanır.

DFT algoritması Hızlı Fourier Dönüşümüne kıyasla biraz daha yavaştır. Ancak spektrum analizörümüz yüksek hıza ihtiyaç duymuyor ve eğer saniyede yaklaşık 30 karelik bir güncelleme hızı sağlayabilirse, bu, bir ses sinyalinin spektrumunu görselleştirmek için fazlasıyla yeterli olacaktır. Her durumda, bizim versiyonumuzda saniyede 100 kare hıza ulaşmak mümkündür, ancak bu, iki satır karakterli bir LCD gösterge için zaten çok yüksek bir parametre değeridir ve önerilmez. 32 noktalı ayrık Fourier dönüşümü için örnekleme frekansı 20 kHz'dir ve dönüşümün sonucu simetrik olduğundan yalnızca ilk yarıyı kullanmamız gerekir; ilk 16 sonuç. Bu nedenle frekans spektrumunu 10 kHz'e kadar görüntüleyebiliyoruz ve analizörün çözünürlüğü 10 kHz/16 = 625 Hz.

Tasarımın yazarı DFT hesaplamalarının hızını artırmak için girişimlerde bulundu. Bu dönüşümün N noktası varsa, o zaman sinüs ve kosinüsün N2/2 değerlerini bulmamız gerekir. 32 nokta dönüşümümüz için 512 sinüs ve kosinüs değerini bulmamız gerekiyor. Ancak bunları bulmadan önce açıyı (derece) hesaplamamız gerekiyor, bu da biraz CPU zamanı gerektirecek, bu nedenle bu hesaplamalar için değer tablolarının kullanılmasına karar verildi. Mikrodenetleyici programında hesaplama yapılırken 8 bitlik bir mikrodenetleyicide işlem daha uzun süreceği için kayan noktalı ve çift duyarlıklı sayılar kullanılmaz. Bunun yerine arama tablolarındaki değerlerde 16 bitlik tam sayı verilerinin 10000 ile çarpılması kullanılır. Daha sonra dönüşüm gerçekleştirildikten sonra sonuçlar 10000'e bölünür. Bu yaklaşımla saniyede 120 adet 32 ​​noktalı dönüşüm gerçekleştirmek mümkündür. , bu da cihazlarımız için fazlasıyla yeterli.

ATmega32 mikrodenetleyici üzerinde bir spektrum analizörünün çalışmasının gösterilmesi

İndirilenler

Kaynak kodu (mikrodenetleyici programı, sinüs, kosinüs ve açı veri tabloları) -

  • AVR'de ışık ve müzikten öteye gitmenin zor olduğu, parametrelerin doğru olmadığı açık. Ancak saniyede 120 adet 32 ​​noktalı dönüşüm çoğu görev için yeterli olabilir. Ve elbette 625Hz'lik başka bir örnek alabilir veya daha doğrusu yenileme hızını kaybedebilirsiniz. MK'nin kötü hissedeceğini belirtmekte fayda var; performans açısından ona bağlayabileceğiniz çok az şey var. Ancak burada, donanım veri aktarım yöntemlerini kullanarak sonucun çıktısını düzenleyebilirsiniz. Daha sonra yardımcı bir mikrodenetleyici olacak ve asıl olan yalnızca ondan veri alacak ve onu diğer işlemlerle uyumlu olarak işleyecektir. Genel olarak, bu hala işlemcinin frekansına bağlıdır. Bir zamanlar mega'yı 20 MHz'in üzerine hız aşırtmak mümkündü, ancak bu görevler için muhtemelen yalnızca yüksek frekanslarda aksaklıklar yaşayacağız. Fikir güzel, keşke daha fazla matematik bölümü yazılsaydı... bu onun MK'ye uygulanmasıydı
  • Ayrıca daha ilginç analizörler de yaptım: You Tube veya renkli LCD'deki versiyonu: You Tube, ünlü Chen kütüphanesini temel alıyor :)
  • “açıyı (dereceyi) hesaplamamız gerekiyor” Bu tabloların değerlerinin nasıl hesaplandığını bize daha detaylı anlatabilecek olan var mı?
  • Sinüs ve kosinüs tablosunda her şey açıktır. Degree_lookup tablosundaki değerlerin nasıl hesaplandığı belli değil mi?

Tüm sinyaller, ister onları uydurmuş olun ister Evren'de gözlemlemiş olun, aslında farklı frekanslardaki basit sinüs dalgalarının toplamıdır.

16x2 LCD ve ATmega32 mikrodenetleyiciden küçük bir ses spektrum analizörü (0 - 10 kHz) yaptım. Basit DFT'lerle (Ayrık Fourier Dönüşümü) başladım. FFT (Hızlı Fourier Dönüşümü), DFT'den yalnızca daha yüksek hız ve biraz daha karmaşık bir algoritma açısından farklılık gösterir, ben kullanmadım, belki daha sonra eklerim.

DFT, FFT'ye kıyasla yavaştır. LCD spektrum analizörüm, FFT'nin sağlayabileceği yüksek hıza ihtiyaç duymuyor ve ekrandaki görüntü yaklaşık 30 kare/sn hızında değişiyorsa, bu, ses spektrumunu görselleştirmek için fazlasıyla yeterlidir. Ancak zaten 100 fps civarına ulaşabiliyorum ancak LCD için çok yüksek bir yenileme hızı önerilmez. 20 kHz'de örneklenen ses 32 DFT noktası üretir. Dönüşüm sonucu simetrik olduğundan yalnızca ilk 16 sonucu kullanmam gerekiyor. Buna göre maksimum frekans 10 kHz'dir. Böylece 10kHz/16 = 625Hz olur.

DFT hesaplamasının hızını arttırmaya çalışıyordum. N DFT noktası varsa sinüs ve kosinüs (N^2)/2'yi bulmamız gerekir. 32 noktalı DFT için 512'nin sinüs ve kosinüsünü bulmamız gerekir. Sinüs ve kosinüsü bulmadan önce, CPU zamanının bir kısmını kaplayan açıyı (dereceyi) bulmamız gerekiyor. Bunu yapmak için sinüs ve kosinüs tabloları hazırladım. Sinüs ve kosinüs değerlerini 10000 ile çarparak sinüs ve kosinüs 16 bitlik değişkenler yaptım. Dönüşümden sonra her sonucu 10000'e bölmem gerekiyor. Artık saniyede 120 adet 32 ​​noktalı DFT hesaplayabiliyorum ki bu 10000'den fazladır. bir spektrum analizörü için yeterlidir.

Görüntülemek

64 Bayt yerleşik LCD belleğine yüklenen özel LCD karakterleri kullandım. İnternette 16x2 LCD'nin spektrum analiz cihazı ekranı olarak kullanıldığı bir video gördüm ve bu fikri kullandım.

Ses girişi

Spektrum analizörünün en önemli parçalarından biri, sinyali elektret mikrofondan elde etmektir. Gelişime özellikle dikkat edilmelidir. ön amplifikatör mikrofon için. ADC girişinde sıfır seviyesini ve maksimum seviyeyi besleme voltajının yarısına eşit olarak ayarlamamız gerekir; 2,5V. -2,5V ile +2,5V arası gerilimle beslenebilmektedir. Ön yükselticinin bu sınırları aşmayacak şekilde yapılandırılması gerekir. Mikrofon ön amplifikatörü olarak LM324 op amp kullandım.

Radyo elemanlarının listesi

Tanım Tip Mezhep Miktar NotMağazanot defterim
Görüntülemek
MK AVR 8 bit

ATmega32

1 Not defterine
Kapasitör22pF2 Not defterine
Kapasitör0,1 uF1 Not defterine
Elektrolitik kondansatör100 uF1 Not defterine
Direnç

100Ohm

1 Not defterine
Düzeltici direnci4,7 kOhm1 Not defterine
Kuvars rezonatör16MHz1 Not defterine
LCD ekran16x21 Not defterine
güç ünitesi5V1 Not defterine
Ses girişi
U1 Operasyonel amplifikatör

LM324

1 Not defterine
C1 Kapasitör1 µF1 Not defterine
C8 Kapasitör0,01 uF1 Not defterine
R1 Direnç

220 kOhm

1 Not defterine
R2, R3 Direnç

10 kOhm

2 Not defterine
R4, R9 Direnç

1 kOhm

2 Not defterine
R5 Direnç

Hem basit tamsayı çekirdekleri hem de kayan nokta verilerini işleyen C6000 ailesi alt ailesi gibi canavarları içeren Texas Instruments TMS320 serisinden DSP gibi dijital sinyal işleme (DSP) için birçok özel işlemci vardır. Analog Devices'ın (aşağı yukarı evrensel BlackFin'i içeren) tam bir ADSP serisi var, ayrıca daha fazlası da var basit çözümler MicroChip'ten - dsPIC.

Ancak uzmanlaşmış bir DSP iyidir, ancak her zaman bu kadar gerekli midir? Evet, devasa bir bilgi akışıyla yeri doldurulamaz, ancak daha basit işleme görevleri de var. Spesifik olarak, çift dönüşüm göreviyle ilgileniyordum - ses sinyali evrilir, böylece bir spektrum elde edilir, daha sonra spektrum üzerinde herhangi bir işlem gerçekleştirilebilir ve ters dönüşüm gerçekleştirilebilir, böylece işlenmiş bir sinyal elde edilebilir. Tüm bunların gerçek zamanlı olarak yapılması ve telefon kalitesinden daha düşük olmayan bir kalite elde edilmesi gerekiyor.

Bu 2000 yılı değil, fiyatı önemli ölçüde düşen yüksek performanslı ARM7/Cortex-M3 çekirdeklerine dayanan tek çipli çözümler var; bunlar 32 bittir, 32 bit çarpma işleminin donanım uygulamasına sahiptir (ayrıca , neredeyse bir DSP çarpma-biriktirme işlemi ve 64 bit sonuç) ve Cortex-M3 ayrıca donanım bölümünü de içerir.

Sinyal işlemenin benim uzmanlık alanım olmadığı, neredeyse tüm bilgilerin (veya daha doğrusu ilkelerin anlaşılmasının) enstitüden korunduğu konusunda sizi hemen uyarmak istiyorum, ancak şimdi sadece test etmek ve uygulamak istedim. Demek istediğim, açıklamalarda, kavramların ikamesinde vb. yanlışlıklar olabilir. Aslında akademik doğruluk beni pek endişelendirmedi.

Hemen hemen her DSP için yukarıda özetlenen görev basit ve anlaşılırdır. Peki genel amaçlı bir RISC çekirdeği bunun üzerinde nasıl davranacak? AVR veya PIC'yi düşünürsek, bunların yeterli olması pek olası değildir. 8 bit ve düşük saat frekansının etkisi vardır. Ancak Elm-Chan'ın AVR üzerinde FFT yürüttüğü ve sinyalin spektrumunu çizdiği tasarımları var. Bununla birlikte, bu durumda, gerçek zamanlı olarak, basit bir görselleştirme yapılır (minimum işleme doğruluğu ile) ve sinyal işlemeyi kabul edilebilir ses kalitesiyle tamamlamaz.

LPC2146, ARM7TDMI-S çekirdeğini temel alan ve maksimum 60 MHz saat frekansına sahip (pratikte 72 ve hatta 84 MHz'de çalışmaz) deneysel bir çip olarak seçildi. Neden? Birincisi, bunun için bir hata ayıklama kartım var ve ikincisi, gemide bir ADC ve DAC var, yani. minimum dış kaplama gereklidir.

Küçük bir teori

Öncelikle FFT'nin (Hızlı Fourier Dönüşümü) ARM mikrokontrolörleri üzerindeki performansını değerlendirmek ilginçti. Bu değerlendirmeye dayanarak, bir ses verisi akışını işlemek için yeterli hıza sahip olup olmadığı ve böyle bir mikrodenetleyicide hangi örnekleme frekansı ve kaç kanalın işlenebileceği sinyalinin olduğu sonucuna varabiliriz.

Fourier dönüşümünü temel alarak akıllı filtreler (çok çekici özelliklere sahip) oluşturabilirsiniz. Öncelikle sinyalin tonunu değiştirme (spektrumu yükseltme ve alçaltma) ve spektrumu "yansıtma" sorunlarıyla ilgileniyordum. İkincisi, SDR radyolarında LSB alt yan bant radyo yayınlarını dinlemek için gereklidir.

Size teori yüklemeyeceğim ve Fourier Dönüşümünün ne olduğunu açıklamayacağım; bu konuyla ilgili benim kullandıklarımdan oldukça fazla materyal var: bir wiki ve çok iyi ve bilgilendirici bir kitaptan bir bölüm.

Yazılım uygulaması

FFT'nin pek çok yazılım uygulaması var ancak ben kendiminkini yazdım. Takip ettiğim ana hedef, kodu belirli bir mimariye göre optimize etmekti. İlk olarak hemen 32-bit'e odaklandım, ikinci olarak sadece tamsayı hesaplamaları gerekiyordu ve bölme işleminden kaçınmak isteniyordu. Bu gereksinimleri karşılayacak hazır bir şey bulmak zaten sorunlu.

Önceden hesaplanabilecek tüm sabitler hesaplandı ve tablolara yerleştirildi (çoğunlukla trigonometrik fonksiyonların değerleri). Bu, algoritmanın ana optimizasyonudur, aksi takdirde açıklanan algoritmayı neredeyse tamamen tekrarlar.

Bunlardan en önemlisi tamsayı hesaplamalarının gerekliliğidir. Uygulama sürecinde 32 bitlik döngü değişkenlerinden birinde taşmaya neden olan bir hata bile oluştu. Üstelik tüm test verilerinde görünmüyordu, bu yüzden bulunana kadar oldukça baş ağrısına neden oldu.

Tüm kaynak metinleri tek arşivde topladım. Uygulama nihai değildir, mükerrer hesaplamalar vardır (spektrum ve faz simetrisi dikkate alınmaz) ve hesaplamalar için halihazırda çok fazla sayıda tampon kullanıldığından tampon kullanımının optimizasyonu gereklidir. rasgele erişim belleği(1024 puanlık dönüşüm için neredeyse 12k).

İlk testler

Davul sesi: 1024 noktalık bir örnek için dönüşüm hızını test ediyorum, işlemci çekirdek frekansı 60 MHz. Test bir emülatörde gerçekleştirildi, bu nedenle% 100 doğru olduğu iddia edilmiyor, ancak bu sonuç bir gösterge olarak kullanılabilir (önceki deneyimlerimde emülatör yalan söylese de çok fazla değildi). Kodun ilk sürümünün testi, RealView MDK derleyicisi, O3 optimizasyon seçeneği, ARM kod oluşturma modu.

Peki ne görüyoruz:

Her dönüşüm için 6 ms, gidiş-dönüş dönüşümü için toplam 12 ms'nin biraz üzerinde. 44100Hz örnekleme frekansı (ses için standart) ve 16 bit'e kadar çözünürlükteki örneklerle saf hesaplamaların ~44*12ms = 528ms süreceği ortaya çıktı. Ve bu, bazı kod optimizasyonlarının henüz tamamlanmadığı ürün yazılımının ara bir sürümündedir (tahminlere göre, algoritma neredeyse 2 kat hızlandırılabilir)! Bana göre bu sadece mükemmel bir gösterge.

Toplamda, çekirdek yükün %50 civarında olması bekleniyor; ADC'ler, DAC'ler ve diğer veri aktarımlarıyla çalışırken spektrum üzerindeki dönüşümler ve genel giderler için %50 daha kalıyor. Örnekleme frekansını “telefon” seviyesine (yaklaşık 4800-9600Hz) düşürürseniz, çekirdek yükü daha da düşük olacaktır (yaklaşık %15-30).

Yani işin matematiksel kısmı az çok açıktır. Somut uygulamaya geçebilirsiniz.

Ütü

Test platformu için hoparlörlü Keil MCB2140 geliştirme kartını kullandık. Cihazın doğrusal çıkışına bağlanmak için bir Mini-Jack kablosu lehimlenir ve basit bir giriş zinciri monte edilir. Daha önce de belirtildiği gibi, kartta zaten mikro denetleyicinin analog çıkışına bağlı bir hoparlör var ve kontroller (düğme ve potansiyometre) var.

Giriş devresinin bir taslağı:


Yazılımın hata ayıklaması aşamalar halinde gerçekleşti:

  1. Gerekli tüm çevre birimlerinde hata ayıklama: ADC, DAC, zamanlayıcılar, LED göstergesi.
  2. Sinyal sayısallaştırma ile test: Veriyi gerekli hızda sayısallaştırıp bir arabelleğe koyuyorum, ardından verileri arabellekten çıkarıyorum ve sinyali oynatıyorum. Onlar. herhangi bir dönüşüm olmadan zaman içinde basit sinyal değişimi. Bu aşamada daha ileri çalışmalar için gerekli olan 2 tamponla çalışma mekanizması test edilir.
  3. İLE önceki versiyon doğrudan ve ters Fourier dönüşümleri eklenir. Bu test son olarak FFT kodunun doğru çalıştığını doğrulamanın yanı sıra kodun mevcut performansa uyup uymadığını da kontrol eder.
  4. Bunun ardından uygulamanın ana iskeleti yapıldıktan sonra pratik uygulamalara geçebilirsiniz.

Sorun, koda FFT'yi ekledikten sonra ortaya çıktı: sinyalde yabancı gürültü ve ıslıklar belirdi. Genel olarak bu davranış bana oldukça tuhaf geldi çünkü... Dönüşüm olmadan dijital yoldan geçen sinyal oldukça temiz kaldı. Bunun ilk nedeni: Analog devreden sonra ADC'deki sinyal genliği tam değildi (0-3,3V), ancak oynatıcının maksimum ses seviyesinde yalnızca 0,5-2V dahilindeydi, ikincisi: tam sayı nedeniyle oldukça güçlü gürültü hesaplamalar (+-1 birim, bunun duyulabilir parazite neden olmak için yeterli olduğu ortaya çıktı).

İlk sorunla mücadele etmek için analog kısmın ayarlanmasına başlanmasına karar verildi. Sorunu gürültüyle çözmek için alçak geçiren filtre kullanmayı deneyin.

Uygulama 1: Sinyalin tonunu değiştirme

Kartın bir potansiyometresi var ( değişken direnç), kontrol amaçlı kullanılabilir. Bu durumda, sinyal spektrumunu yukarı ve aşağı kaydıracak şekilde ayarlar; bu, favori kompozisyonlarınızı "dönüştürmeye" yetecek kadardır.

Frekans alanında şunlar olur:


Bu durumda dönüşüm sonucu 2 arabellekte bulunur. Tamponlardan biri gerçek kısım, diğeri sanal kısımdır. İçlerinde elde edilen sayıların fiziksel anlamı: Reel kısım harmoniklerin değerlerini, sanal kısım ise bu harmoniklerin faz kaymasını içerir. Üstelik gördüğünüz gibi başlangıç ​​sinyali N değerleri ile tanımlanıyor ve dönüşüm sonrasında 2N değerleri elde ediliyor. Bilgi miktarı değişmez ve tampon verinin değerlerin kopyalanması şeklinde artıklığa sahip olmasından dolayı bilgi miktarında 2 kat artış meydana gelir.




Tepe