Nasıl bir filtre kullanmalı?

sanirim ben anlamadim sen AC mi olcmek istiyordun, ben dc uzerine binen gurultuden kurtulmak istedigini saniyordum.:)
 
Amaç sinyalin RMS değerini ölçmek. Ama sinyalin üzerinde bir ton gürültü var, ölçümün bu gürültüden etkilenmemesi lazım.
 
osiloskop goruntusunun data hali var mi elinde, daha once kullandigim bir filtre algorimasi var, denemek istiyorum, ama baya bir islem gucu gerektiriyor, pc icin hazirlamistim.
 
osiloskop goruntusunun data hali var mi elinde, daha once kullandigim bir filtre algorimasi var, denemek istiyorum, ama baya bir islem gucu gerektiriyor, pc icin hazirlamistim.

Şimdi bir release hazırlıyorum, onu hallettikten sonra datasını alır gönderirim. Osiloskobun kullandığı filtre muhtemelen Butterworth FIR filtre. Bunlar en kaliteli filtreler arasında. Ama bunların kötü tarafı, gecikme fazla (yani ilk giren datanın çıkması) bir de çok fazla işlem gerektiriyor.

Eğer senin ortalama alma önerisini adamlar kabul ederse o çok kolay bir çözüm olacak gerçekten. Ekrana RMS power yerine Average power yazacağız o kadar.
 
Hocam aslında son kullanıcı, average nedir rms nedir bilmez. Böyle bir uygulamada ekranda sadece power yazması bile yetiyor. Sonuçta kullanıcıya bir fikir verse yeter.
 
osiloskop goruntusunun data hali var mi elinde, daha once kullandigim bir filtre algorimasi var, denemek istiyorum, ama baya bir islem gucu gerektiriyor, pc icin hazirlamistim.

10 Msps örnekleme ile 1 milyon tane nokta kaydettim. şu anda 112 W çıkış alıyorum ve grafik de kabaca 4 A akıma karşılık geliyor. MATLAB .mat dosyası olarak da kaydettim (ikisi aynı grafik değil, farklı zamanlarda kaydedildi)

a.png
 

Ekler

  • a.zip
    1.2 MB · Görüntüleme: 56
Bu arada ortalama alma işinin olmayacağını farkettim. Sinyal ne olursa olsun, ortalaması hep aynı ve o da ADC nin dinamik aralığının yarısı. Yani 1 W ta de 500 W ta da ADC örneklerinin ortalaması 2048 civarında çıkıyor. RMS olması şart. Filtreden kurtuluş yok.
 
Şimdi 5. dereceden IIR filtre ile denedim. kesim frekansını 3 kHz olarak tanımladım ve 4 kHz de -40 dB zayıflatma yaptırıyorum. İbreler daha az hareket ediyor şimdi, ama gene de fazla. Daha önce ± 5W gibi oynama yapıyordu, şimdi belki ±3 W. Audio analizörden çok temiz sinyal veriyorum, ibrelerde hiç hareket olmaması lazım.

a.jpg
 
Ortalama alacaksan aldigin orneklerin mutlak degerinin ortalamasini almalisin.
 
Ortalama alacaksan aldigin orneklerin mutlak degerinin ortalamasini almalisin.

Oradan RMS'i hesaplayabilir miyiz? Giriş sinyali tek bir sinüs olsa evet derim de, giriş sinyali sinüslerin toplamı, o yüzden emin değilim.
 
Doğrultulmuş sinüsün ortalamasının genliğe oranı 2/pi = 0.64 (yaklaşık). RMS ise 0.71.
Gürültünün ortalamada elimine edileceği ve dalga formunun her zaman sinüs olacağı varsyımı ile bu oranlarla dönüştürülebilir.
 
1695675245529.png


Biraz karalama oldu ama. Yukarıdaki eşitlik çalışır diye düşünüyorum.

Vmax: Dalganın tepe noktası.
Vavg: Mutlak değerlerin ortalamsı.

Dikkat etmek gereken tek konu sıfır geçişleri yakalayıp ortalama bu noktalar arasında kalacak şekilde alınmalı, ya da periyoda kıyasla yeterince uzun bir süre örneklenmeli.
 
Sıfır geçişleri tespit ederek denedim, hiçbir fark yaratmadı. Hatta düşük frekanslarda çok büyük veri kaybına sebep olduğu için daha da olumsuz oluyor. Düşük frekanslarda sinüs alternans sayısı çok azalıyor.

Sıfır geçişi kaldırdım ve 100 olan buffer boyutunu 3000 yaptım. Düzelme var, ama yeterli değil.

10 kHz olan örnekleme hızını da 50 kHz yaptım, gene hafif bir iyileşme var, ama olması gereken seviyeden çok uzak hala.

Ozone debugger'i kullanarak işlemcinin okuduğu örnekleri binary dosyaya kaydedip MATLAB ile açtım. 60 ms de bir okunan 3000 tanelik buffer şöyle

Screenshot_20230926_014159.jpg
 
Sonra deltalardan gitmeyi denedim. Yani varsayım şu: iki tane ardışıl örnek birbirinden fazla uzak olmamalı. Eğer fazla uzak ise aradaki mesafeyi yarıya bölmeyi denedim. Bunların hepsi birer iyileşme sağlıyor, ama hiçbirisi yeterli değil.
 
Biraz MATLAB seviyesinde bu datayi kurcalayacağım bakalım. Signal Processing Toolbox ta bir sürü değişik algoritmalar var. Mesela şimdi hemen ilk aklıma gelen medyan filtrelemeyi denedim

a.jpg
 
Son düzenleme:
Filtrelemeyi medfilt1 fonksiyonu ile yapmıştım. Tam da bu işlere uygun bir filtre gibi duruyor. Bir de bunun derecesi de var. Belirtilmezse (yukarıdaki durum) derece 3. Şimdi 5 derece ile tekrar denedim ve hiç iğne pals kalmadı. Üçüncü ve beşinci derece filtrelenmiş sinyali üst üste bastırınca da hiçbir genlik değişiminin olmadığını görüyorum. Şimdi bu işi firmware'de yapmanın yolunu bulmam lazım.

Screenshot_20230926_141320.jpg
 
Median algoritması, uygulanması zor bir algoritma değil. Ama zaman kısıtlı olduğu için çok hızlı sort eden algoritma lazım. Konu ile ilgili ChatGPT ye müracaat ettim. Sabit uzunlukta 5 tane elemandan oluşan bir array var, bunu en kısa zamanda nasıl sort ederiz diye. ilginç bir algoritma önerdi, her şart altında sabit sürede sort ediyor.

Aslında tam assembly lik bir algoritma. Neyseki o kadar da işleme zaman açısından darda değilim, ihtiyaç olmayacak büyük ihtimalle.

1695737978351.png
 
medyan filtreyi firmware de uyguladım. 5. derece olarak hesaplatıyorum. Sonuç şu anda çok daha iyi. İbre neredeyse hiç kıpırdamıyor. Ama sanırım dereceyi arttırarak daha iyi sonuç almak da mümkün. window sort için de daha etkili bir yöntem aklıma geldi onu deneyeceğim.

1695743638319.png
 
  • Beğen
Reactions: nt
Algoritmadan emin olmak için ChatGPT nin medyan çıktısı ile Matlab'in çıktısını karşılaştırdım. Matlab'inkisi daha iyi çalışıyor. Sonra inceleyince farkettim ki GPT efendinin algoritması 5 li window'u her zaman doğru sort etmiyor. Demekki işkembeden atmış :mad:

"Çalışmıyor bu" dedim. Gene özür diledi başka bir algoritma verdi ... En iyisi bu "sorting network" ün aslını anlamak ve doğrusunu yapmak, yoksa GPT bizi çok uğraştıracak. İşte burada da görülüyor, GPT ye işin tamamını yaptırağım, sonra da göbeğimi kaşıya kaşıya kodu copy paste edeyim deyince böyle oluyor. Onun yerine, bana sorting network fikrini verdiği için faydanın bu olduğunu değerlendirmek lazım, oradan da araştırmayı derinleştirmek lazım.
 
Problemin tanını şu: Bir array içerisinde 5 tane rakam var.

C++:
int window[] = {6, -2, 10, 8, 7};

Bunları sıralayacağız. C kütüphanesinde sort fonksiyonu var, ama çok verimsiz ve uzun sürüyor. 3000 tane ADC verisi var, her bir veri için bu 5 değer farklı ve bu 5 li sortun her birisi için yapılması gerekiyor, o yüzden çok hızlı çalışan bir algoritma lazım. Tercihen de sabit sürede işi bitirecek.
 

Çevrimiçi personel

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,970
Mesajlar
101,788
Üyeler
2,514
Son üye
evrenbasaran

Son kaynaklar

Son profil mesajları

deneyci wrote on hakan8470's profile.
Sibonge uNkulunkulu ngokuhlukahluka asinike kona.

Bu hangi dil? :)
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
Back
Top