4 vezetékes rezisztív érintőképernyő olvasása
Kezdem kapisgálni, de még nem tudnám megvalósítani!
Maradjunk az FIR módszernél!
Az 5 lépéses módszer már egészen jó értékeket mutat.
(A következő probléma: hova tároljak 100 000 Wordot? Nincsen ennyi szabad helyem, na meg ezt 2* áthajtani az ADC-n ? )
Kezdjük kisebb tömbökkel.
Eltárok 100 mérést.
Azon Lefuttatom a Fir rutint. Az eredményt eltárolom Tömb(i) be
Ezt Megismétlem, mondjuk 5*
A kapott Tömb(5)-re megint rá eresztem az Fir rutinomat.
Nekem eddig valami ilyesmi jött le! Jól gondolkozom?
Csak még mindég nem tiszta az A tömbe mi kerül? 
Maradjunk az FIR módszernél!
Az 5 lépéses módszer már egészen jó értékeket mutat.
(A következő probléma: hova tároljak 100 000 Wordot? Nincsen ennyi szabad helyem, na meg ezt 2* áthajtani az ADC-n ? )
Kezdjük kisebb tömbökkel.
Eltárok 100 mérést.
Azon Lefuttatom a Fir rutint. Az eredményt eltárolom Tömb(i) be
Ezt Megismétlem, mondjuk 5*
A kapott Tömb(5)-re megint rá eresztem az Fir rutinomat.
Nekem eddig valami ilyesmi jött le! Jól gondolkozom?
Kód: Egész kijelölése
Dim M(konvhossz) As Word ' minta vektor
Dim A(konvhossz) As Word 'együttható vektor
Function Konvolval_fir()as Word
Local I As Byte
Local Er As Word
For I = 1 To Konvhossz
Er = M(i) * A(i)
Konvolval_fir = Konvolval_fir + Er
Next I
End Function
A belinkelt "WINFILTER" is valami hasonló kódot generáltle:
Ezt kellene megvalósítani?
Kód: Egész kijelölése
Filter model: Butterworth
Filter order: 1
Sampling Frequency: 1000 Hz
Cut Frequency: 100.000000 Hz
Coefficents Quantization: 16-bit
Z domain Zeros
z = -1.000000 + j 0.000000
Z domain Poles
z = 0.509525 + j -0.000000
***************************************************************/
#define Ntap 31
#define DCgain 65536
__int16 fir(__int16 NewSample) {
__int16 FIRCoef[Ntap] = {
15,
-16,
20,
-21,
31,
-25,
58,
-17,
142,
63,
467,
525,
2011,
3159,
13525,
25654,
13525,
3159,
2011,
525,
467,
63,
142,
-17,
58,
-25,
31,
-21,
20,
-16,
15
};
static __int16 x[Ntap]; //input samples
__int32 y=0; //output sample
int n;
//shift the old samples
for(n=Ntap-1; n>0; n--)
x[n] = x[n-1];
//Calculate the new output
x[0] = NewSample;
for(n=0; n<Ntap; n++)
y += FIRCoef[n] * x[n];
return y / DCgain;
}
Igen, csak neked az IIR jobb lenne, mert nagyságrenddel gyorsabb. A PIR az jóval pontosabb, de itt ez nem kritikus! A leírásokban megtalálod, mindkettő előnyét, hátrányát.
Mindkét esetben 1 lépcsős kell( Elsőfokú). Akkor kellene nagyobb rangú (fokú), ha pl egy marha pontos hőmérőt szeretnél csinálni!
Látom kezd tisztulni a kép!:)
Mindkét esetben 1 lépcsős kell( Elsőfokú). Akkor kellene nagyobb rangú (fokú), ha pl egy marha pontos hőmérőt szeretnél csinálni!
Látom kezd tisztulni a kép!:)
Sajnos, ha még az 1*1 et sem értem, nem tudok négyzetre emelni!
Enyit az IIR-röl!
Új gyakorlatnak Átraktam a fenti C-t Bascomba.
Ami gond, hogy még a WinFilter hez sem értek!
Amit ki adot álandókat a –értékek nem jók a Wordba!
Ezeket a –okat ki lehet szedni vagy válasszak másik változó típust?
Igy alakult!
De például Ez mi: Dcgain = 65536 ?
És ez: Filter model: Butterworth
Ezt hol tudom beállítani: "Mindkét esetben 1 lépcsős kell( Elsőfokú)"

Enyit az IIR-röl!
Új gyakorlatnak Átraktam a fenti C-t Bascomba.
Ami gond, hogy még a WinFilter hez sem értek!
Amit ki adot álandókat a –értékek nem jók a Wordba!
Ezeket a –okat ki lehet szedni vagy válasszak másik változó típust?
Kód: Egész kijelölése
Const Ntap = 32
Const Dcgain = 65536
Dim Newsample(ntap) As Word
Dim Firx(ntap) As Word '/ / Input Samples
Dim Firy(ntap) As Dword ' //output sample
Dim N As Byte
Dim Fircoef(ntap) As Word
Fircoef(1) = 15
Fircoef(2) = -16
Fircoef(3) = 20
Fircoef(4) = -21
Fircoef(5) = 31
Fircoef(6) = -25
Fircoef(7) = 58
Fircoef(8) = -17
Fircoef(9) = 142
Fircoef(10) = 63
Fircoef(11) = 467
Fircoef(12) = 525
Fircoef(13) = 2011
Fircoef(14) = 3159
Fircoef(15) = 13525
Fircoef(16) = 25654
Fircoef(17) = 13525
Fircoef(18) = 3159
Fircoef(19) = 2011
Fircoef(20) = 525
Fircoef(21) = 467
Fircoef(22) = 63
Fircoef(23) = 142
Fircoef(24) = -17
Fircoef(25) = 58
Fircoef(26) = -25
Fircoef(27) = 31
Fircoef(28) = -21
Fircoef(29) = 20
Fircoef(30) = -16
Fircoef(31) = 15
Function Fir(dim Newsample As Word)as Word
Local Er As Dword
' //shift the old samples
For N = Ntap -1 To 1 Step -1
Firx(n) = Firx(n - 1)
Next N
' //Calculate the new output
X(1) = Newsample
For N = 1 To Ntap
Er = Fircoef(n) * Firx(n)
Firy = Firy + Er
Next N
Fir = Firy / Dcgain
End Function
De például Ez mi: Dcgain = 65536 ?
És ez: Filter model: Butterworth
Ezt hol tudom beállítani: "Mindkét esetben 1 lépcsős kell( Elsőfokú)"
Majd érteni fogod! Én is így voltam vele.
Mert előjelesen kell kezelni.
A DC gain az egy erősítési tényező. Ez kicsi jeleknél illetve kis változásoknál lényeges. Belátható, hogy pl egy hőmérő esetén 0,001V/C fok(szándékosan eltúlzott a példa) felbontásnál, nehéz eldönteni, mi a zaj, mi a jel. Ezért erősíteni kell. A jellel együtt a zaj is erősödik, illetve a kettő közötti különbség is. Ezután már könnyebb szűrni. Érted?
A Butterworth egy modell. Ahogyan a Chebyshev és társai is.
Ezek lényegében szűrési modell függvények.
Ezeknek saját karakterisztikájuk van. Előnyökkel, hátrányokkal. Ezt meg kell érteni , tanulni.
Szemléletesebben:
Van egy sódercsomód. Neked abból csak a 3mm-es vagy nagyobb kavicsok kellenek. Tehát kell egy rosta, ami kiszűri a 3mm kisebbeket. Azt hogy milyen rostát használsz te döntöd el. Kör alakút (pl Butterworth) vagy négyzet alakút (Chebyshev).
Ráadásul rossz a szemed és nehezen látod a különbséget. Ezért szemüveg kell, ami felnagyítja a képet. Azaz DC GAIN.
Tudom hogy buta példa, de valahogy így tudom szemléltetni.
A filter order a rang. Az az hány lépcsőből áll. Mennyi szűrőt teszel egymás után! Ha 8-at akkor az 8-ad fokú/rangú lesz.
Mert előjelesen kell kezelni.
A DC gain az egy erősítési tényező. Ez kicsi jeleknél illetve kis változásoknál lényeges. Belátható, hogy pl egy hőmérő esetén 0,001V/C fok(szándékosan eltúlzott a példa) felbontásnál, nehéz eldönteni, mi a zaj, mi a jel. Ezért erősíteni kell. A jellel együtt a zaj is erősödik, illetve a kettő közötti különbség is. Ezután már könnyebb szűrni. Érted?
A Butterworth egy modell. Ahogyan a Chebyshev és társai is.
Ezek lényegében szűrési modell függvények.
Ezeknek saját karakterisztikájuk van. Előnyökkel, hátrányokkal. Ezt meg kell érteni , tanulni.
Szemléletesebben:
Van egy sódercsomód. Neked abból csak a 3mm-es vagy nagyobb kavicsok kellenek. Tehát kell egy rosta, ami kiszűri a 3mm kisebbeket. Azt hogy milyen rostát használsz te döntöd el. Kör alakút (pl Butterworth) vagy négyzet alakút (Chebyshev).
Ráadásul rossz a szemed és nehezen látod a különbséget. Ezért szemüveg kell, ami felnagyítja a képet. Azaz DC GAIN.
Tudom hogy buta példa, de valahogy így tudom szemléltetni.
A filter order a rang. Az az hány lépcsőből áll. Mennyi szűrőt teszel egymás után! Ha 8-at akkor az 8-ad fokú/rangú lesz.
Ez a magyarázat végre bejött nálam 
Meg született a rutin:
Most akkor ezt így alkalmazom:
És az utolsó „Fir” értéke jó nekem?
Vagy még valami kel hozzá?

Meg született a rutin:
Kód: Egész kijelölése
Const Ntap = 32
Const Dcgain = 65536
Dim Newsample As Word
Dim Firx(ntap) As Word '/ / Input Samples
Dim Firy As Word ' //output sample
Dim N As Byte
Dim Fircoef(ntap) As Integer
'
Fircoef(1) = 15
Fircoef(2) = -16
Fircoef(3) = 20
Fircoef(4) = -21
Fircoef(5) = 31
Fircoef(6) = -25
Fircoef(7) = 58
Fircoef(8) = -17
Fircoef(9) = 142
Fircoef(10) = 63
Fircoef(11) = 467
Fircoef(12) = 525
Fircoef(13) = 2011
Fircoef(14) = 3159
Fircoef(15) = 13525
Fircoef(16) = 25654
Fircoef(17) = 13525
Fircoef(18) = 3159
Fircoef(19) = 2011
Fircoef(20) = 525
Fircoef(21) = 467
Fircoef(22) = 63
Fircoef(23) = 142
Fircoef(24) = -17
Fircoef(25) = 58
Fircoef(26) = -25
Fircoef(27) = 31
Fircoef(28) = -21
Fircoef(29) = 20
Fircoef(30) = -16
Fircoef(31) = 15
Fircoef(32) = 0
Function Fir()as Word
Local Er As Integer
' //shift the old samples
For N = 31 To 1 Step -1
Firx(n) = Firx(n - 1)
Next N
' //Calculate the new output
Firx(1) = Newsample
For N = 1 To Ntap
Er = Fircoef(n) * Firx(n)
Firy = Firy + Er
Next N
Fir = Firy / Dcgain
End FunctionKód: Egész kijelölése
For I = 1 To 32
Newsample = Getadc(adcx)
Fir
Next IVagy még valami kel hozzá?
Örülök neki!
Így lesz a jó!:)
Elvileg nem kell semmi.
Kezdj el játszani a paraméterekkel. Akkor látni fogod, miként is működik.
Még jobban megérted az egészet!
A modelleket, pedig, meg kell tanulni , érteni. Azzal nem lehet mást tenni. Legalább nagy vonalakban, hogy melyik mire jó.
Nekem is sok fehér volt van még. Főleg a matek részében.
Így lesz a jó!:)
Elvileg nem kell semmi.
Kezdj el játszani a paraméterekkel. Akkor látni fogod, miként is működik.
Még jobban megérted az egészet!
A modelleket, pedig, meg kell tanulni , érteni. Azzal nem lehet mást tenni. Legalább nagy vonalakban, hogy melyik mire jó.
Nekem is sok fehér volt van még. Főleg a matek részében.
Futatnám csak most a Bascom tesz padlóra!
Mi a hiba az alábbi rutinban:
Error 242 a 38 sorra: Firw = Fir ?
Mind kettő Word!?

Javítottam!
Mi a hiba az alábbi rutinban:
Error 242 a 38 sorra: Firw = Fir ?
Mind kettő Word!?
Kód: Egész kijelölése
'$regfile = "m128def.dat"
$regfile = "m64def.dat"
$crystal = 16000000
$hwstack = 174
$swstack = 174
$framesize = 174
Const Ntap = 32
Const Dcgain = 65536
'-------------------------------------------------------------------------------
' ADC
'-------------------------------------------------------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Newsample As Word
Dim Firx(ntap) As Word '/ / Input Samples
Dim Firy As Word ' //output sample
Dim N As Byte , I As Byte
Dim Fircoef(ntap) As Integer
Dim Firw As Word
Declare Function Fir()as Word
Do
For I = 1 To 32
Newsample = Getadc(1)
Firw = Fir()
Next I
Loop
End 'end program
Function Fir()as Word
Local Er As Integer
' //shift the old samples
For N = 31 To 1 Step -1
Firx(n) = Firx(n - 1)
Next N
' //Calculate the new output
Firx(1) = Newsample
For N = 1 To Ntap
Er = Fircoef(n) * Firx(n)
Firy = Firy + Er
Next N
Fir = Firy / Dcgain
End Function
Javítottam!
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. július 1. vasárnap, 16:56-kor.
VONAT?
Akkor már mind 1, azért is belevágok az IIR Szűrőbe!

Ez lesz az alap:

Akkor már mind 1, azért is belevágok az IIR Szűrőbe!
Ez lesz az alap:
Kód: Egész kijelölése
/**************************************************************
WinFilter version 0.8
http://www.winfilter.20m.com
akundert@hotmail.com
Filter type: Low Pass
Filter model: Butterworth
Filter order: 4
Sampling Frequency: 1000 Hz
Cut Frequency: 100.000000 Hz
Coefficents Quantization: 16-bit
Z domain Zeros
z = -1.000000 + j 0.000000
z = -1.000000 + j 0.000000
z = -1.000000 + j 0.000000
z = -1.000000 + j 0.000000
Z domain Poles
z = 0.523942 + j -0.146505
z = 0.523942 + j 0.146505
z = 0.660811 + j -0.443178
z = 0.660811 + j 0.443178
***************************************************************/
#define NCoef 4
#define DCgain 128
__int16 iir(__int16 NewSample) {
__int16 ACoef[NCoef+1] = {
5055,
20222,
30333,
20222,
5055
};
__int16 BCoef[NCoef+1] = {
8192,
-19411,
18956,
-8639,
1535
};
static __int32 y[NCoef+1]; //output samples
//Warning!!!!!! This variable should be signed (input sample width + Coefs width + 4 )-bit width to avoid saturation.
static __int16 x[NCoef+1]; //input samples
int n;
//shift the old samples
for(n=NCoef; n>0; n--) {
x[n] = x[n-1];
y[n] = y[n-1];
}
//Calculate the new output
x[0] = NewSample;
y[0] = ACoef[0] * x[0];
for(n=1; n<=NCoef; n++)
y[0] += ACoef[n] * x[n] - BCoef[n] * y[n];
y[0] /= BCoef[0];
return y[0] / DCgain;
}