Efektif değer hesaplamanın basit yolu

Başlatan Zoroaster, 31 Ekim 2016, 20:53:49

Zoroaster

#90
Alıntı yapılan: mihri - 03 Kasım 2016, 18:27:00
KOCAMAN BİR LOW PASS FİLTREDEN BAŞKA BİR ŞEY DEĞİL YÖNTEM.

Demiş fxdev halklıda. Zoroasterin yaptığı en büyük hata ise bu filtrenin RMS değerini verdini iddia etmesi.

Bu filtre bazı durumlar haricinde RMS değerini vermez.

Bedavaya da bunu ıspatlamam🙂

Matematik asla yalan söylemez.

Verdiğim algoritma her durumda RMS değeri hesaplar. Yeterki sample alma frekansınız adam gibi olsun.

Verdiğim algoritmanın yanılacağı tek bir dalga formunu bile örnek gösteremezsiniz. İşkembeden sallamayın.

Bu arada günaydın. Sistemin RC filitre içerdiğinin ip uçlarını taa ne zaman vermiştim zaten.
Gözümüze soka soka RC filitre demenin alemi varmı?

https://www.picproje.org/index.php/topic,66113.msg515470.html#msg515470
https://www.picproje.org/index.php/topic,66113.msg515486.html#msg515486
Seytan deliginden kacti.

mihri

#91
Matematik yalan söylemezde sen hata yapabilirsin ki hatanın kaşı gözü yarılmış durumda :)
"Eppur si muove!"

Zoroaster

Tamam algoya hata yaptıracak örnek sinyalini görelim o zaman.
Seytan deliginden kacti.

Cemre.

MCU'da beceremeyince MATLAB ile deneyeyim dedim, yine beceremedim. Sizce ben mi hatalıyım yoksa kod mu?

MATLAB fonksiyonum
function rms_value = RMS_Calc(sample)
    INITIAL = 1;
    SAMPLES = 400;
    
    rms_value = INITIAL;
    sum_squares = 1*SAMPLES*INITIAL*INITIAL;
    
    sum_squares = sum_squares - (sum_squares/SAMPLES);
    sum_squares = sum_squares + sample*sample;
    if rms_value == 0
        rms_value = 1;
    end
rms_value = (rms_value + (sum_squares/SAMPLES)/rms_value) / 2;


Script'im
x = 0:0.00005:0.04;
for p = 1:1:801
    k(1,p) = sin(2*pi*50*x(1,p));
    m(1,p) = RMS_Calc(k(1,p));
end
        subplot(2,1,2), plot(m);
        subplot(2,1,1), plot(k);


Sonuç


Zoroaster

#94
Matlab bilmiyorum.

Fonksiyonu matematiksel yazsan yeterli.

Haaa bir dakika. O algo benim algo değilki. Onu Cemre verdi. Benle alakası yok o algonun.

Ben sadece özü aynı dedim.
Seytan deliginden kacti.

mihri

Alıntı yapılan: Zoroaster - 03 Kasım 2016, 19:16:10
Tamam algoya hata yaptıracak örnek sinyalini görelim o zaman.

Daha önce de dediğim gibi... şimdi freelance bir tasarım yapıyorum iban göndereyim kabul edersen?
"Eppur si muove!"

Zoroaster

İban ile birlikte banka giriş kodlarını da göndereceksen anlaştık.
Seytan deliginden kacti.

Cemre.

#97
Tamam, matlab'da hesabı yaptım. Benim verdiğim kodda ufak bir değişiklik yapmam gerekti ama şuan çalışıyor.

@Zoroaster 'in tek satırlık kodu ile grafikleri karşılaştırdığımda (aynı verileri girerek iki ayrı grafiği kendim elde ettim) 50Hz sinus dalgasına verdikleri cevaplar çok yakın. Çok yakın olduğunda benim verdiğim kodun sample alma sayısı 9600 sample. 50us'de bir sample alıyorum. 480ms (24 tam peryot) boyunca sample alıp @Zoroaster 'in koduna yaklaşık dalgalılıkta bir sonuç elde edebiliyorum. Sample sayısını 400'e düşürdüğümde ise (1 tam peryot) 0.74 ile 0.68 arasında geziyor değer. (0.7071 olmalı)

Bir de MCU'da iki kodu koşturup hesabın kaç uS tuttuğuna bakılırsa bence güzel bir karşılaştırma olabilir.
Anlaşılır olmadıysa grafikleri de paylaşabilirim.

@Zoroaster hocam 50Hz sinüs 20kHz'de örneklenmiş sinyal için sample sayısı 400 olan halini paylaşabilirseniz onu da karşılaştırmak isterim.


İlk grafik sinüs.
İkinci grafik 400sample ile benim verdiğim kod.
Üçüncüsü @Zoroaster 'in kodu.

Yuunus

yahu @z sen ne ara ise gidiyon ne ara bu islerle ugrasmaya vakit buluyon vallahi performansina hayranim, ben seni takip etmekten yoruldum inan, bagamlilik gibi bisi oldun.

Cemre.

@Zoroaster , Hocam sample alma sıklığımı 5uS'ye düşürdüğümde verdiğim kod sizinkine kıyasla daha az salınımlı bir sonuç veriyor. Bu durumda sizin kodun tek avantajı (şuan görünen avantajı) daha az satırda işin halledilmiş olması. Verdiğim kod optimize edilirse sizinki gibi tek satıra indirilebilir mi? Bilmiyorum. MCU ne kadar vakit harcıyor her iki kodu koştururken bunu da bilmiyorum. Geriye birtek bunların karşılaştırılması kalıyor. Onun dışında @mihri hocamın dediği gibi bir durum varsa, yani spesifik bir sinyal bu hesabı delebiliyorsa zaten sorun çok daha büyük demektir.

Zoroaster

Hiiç korkma.

O kadar sağlam taş gibi bir matematik alt yapısı varki asla ve asla sistemi göçertemeyiz.

Kullanacağınız filitreleme fonksiyonuna göre sistem tepkisi degişir, rıpıl değişir. Fakat her zaman sonuç eli mahkum efektif değere yakınsar.

Seytan deliginden kacti.

FxDev

#101
Puf artık komik bile olmaktan çıktı.

Bari şu foruma yanlış bilgi verme, zavallının biri inanıp bunu kullanacak sonra saç baş yolacak gariban, insanlar bu yüzden ekmeklerinden bile olabilir. 100 kere tartmalıyız bir şeyi paylaşırken forumda bu yüzden.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

fatih6761

#102
Alıntı yapılan: Zoroaster - 03 Kasım 2016, 21:59:21
Hiiç korkma.

O kadar sağlam taş gibi bir matematik alt yapısı varki asla ve asla sistemi göçertemeyiz.

Kullanacağınız filitreleme fonksiyonuna göre sistem tepkisi degişir, rıpıl değişir. Fakat her zaman sonuç eli mahkum efektif değere yakınsar.

Hocam bence V nin katsayısı 16383 değil 16383.5 olmalı. Haksız mıyım?

Ayrıca bu metod sin(t) için de sin(3*t) içinde çalışmalı. Normal RMS formülünden bir farkı yok aslında.

Ve hatta sample edilen değer V ye bölünmek yerine 2*V ye bölünürse daha şık sonuçlar veriyor.

ferdem

Hesap hatalı. Öncelikle, RMS hesabı için işaretin periyodik olması veya sıfır geçiş yakalanması gerekmiyor. Herhangi bir "waveform" un belirli bir süre boyunca harcadığı enerjiye karşı düşen enerjiyi harcatan bir DC voltaj bulunabilir. R=1 alınarak kolaylaştırılır.
Belirli bir zaman diliminde RMS bulmak için o zaman dilimindeki toplam enerjinin bulunması gerekir. Bulduğunuz toplam enerjiyi enerjinin harcandığı süreye bölüp ortalama güç bulursunuz. Pavg=Vrms^2 dir.

Elde bir Vrms ve yeni gelen bir V değeri var ise RMS şöyle bulunur: Toplam enerji nedir, T*Vrms^2 + dt*V^2 dir. Burada T mevcut Vrms in ne kadar süredir(10 saniyelik mesela) hesaplandığı dt de bir örnek için geçen süre. Bu enerjiyi T+dt ye bölerseniz Pavg bulursunuz, bunun da kökünü alırsanız doğru RMS değeri bulursunuz.
Yani şu ifadenin kökü: (T*Vrms^2 + dt*V^2)/(T+dt)

Sizin formül şu: Ve(n)*Ve(n-1)= [16383*Ve(n-1) *Ve(n-1) + V(n)*V(n)]/16384;
Diyorsunuz ki ben toplam enerjiyi bulurken geçmişe 16383 ağırlık yeni gelen enerji dilimine 1 ağırlık vererek ortalama gücü bulurum. Halbuki burada gerçek değerleri kullanmak gerekiyordu. Bu değerler(T ve (T+dt)) her örnekte değişir. Bu değerler ile tepki süresini ayarlıyorum diyemeyiz, RMS değeri geçmişin birikimi, bu ağırlıklandırmada oranlar geçen süre ve örnek süresidir. RMS değeri aynı seyreden bir "waveform" da, sinüs mesela, bu hata ortaya çıkmaz.
Toplam enerjiyi bulunca kök alınması gerekirken en son bulunan RMS e bölüp doğru RMSe yakın ancak hatalı bir RMS buluyorsunuz ki bu hata artarak doğru RMS den iyice uzaklaşabilirsiniz, aşağıda örneği var.

Yöntemin hata yapacağı "waveform" istiyorsak şu 16383 e 1 alınan orandan görebiliriz, örnek uzunluğu 16383 ün üzerinde mesela 50000 veya daha üzeri örnek olsun ve bu sürede genlik ramp fonksiyonuyla değişsin. Yöntemin doğru ve yanlış sonuç verdiği örnek:




close all
clc
per=20;
t=0:0.5e-3:per;
x=(linspace(1,100,length(t))).*sin(2*pi*t);
subplot(1,2,1)
plot(t,x);
ylim([-150 150])
xlabel('t(saniye)');
ylabel('Voltaj(V)');


% sum(abs(x))*1e-3
y=zeros(1,length(x));
%Ve(n)= [Ve(n-1) * 16383 + V(n)*V(n)/Ve(n-1)] /16384;
new_rms=1;
for k=1:length(x)
    new_rms=[new_rms*16383+x(k)*x(k)/new_rms]/16384;
    y(k)=new_rms;
end
new_rms
subplot(1,2,2)
plot(y,'b')
hold on

y2=zeros(1,length(x));
total_energy=0;
for k=1:length(x)
    total_energy=total_energy+x(k)*x(k)*t(2)-t(1);
    avg_power=total_energy/[t(k)-t(1)];
    vrms=sqrt(avg_power);
    y2(k)=vrms;
end
vrms
plot(y2,'r')
legend('ZoroasterRMS','TrueRMS')
xlabel('t(saniye)');
ylabel('Vrms(V)');

fatih6761

@ferdem hocam şu an matlab erişim imkanım yok da bir zahmet şunu deneyebilir misiniz?
[latex]V \leftarrow \frac{1}{N} \left( \left( N - \frac{1}{2} \right) V + \frac{v_{in}^2[n]}{2V} \right)[/latex]
new_rms = (1.0/16384) * (16383.5*new_rms + 0.5*v[k]*v[k] / new_rms)