Waarom help me mijn digitale filter niet werkt

H

hbaocr

Guest
hier de Low Pass Filter code met NUM en DEN ontworpen door Matlab (sptool) dat fsample = 1kHz; Fc = 40Hz; Butterworth IIR filter

# define pi acos (-1)
dubbele Teller [] = (0.00018321602337,0.000732864093479,0.001099296140218,0.000732864093479,0.00018321602337);

dubbele Noemer [] = (1, -3.344067837711875,4.238863950884069, -2.409342856586321,0.517478199788041);

Code:

void CVedothiDlg:: Low_pass_filter (double * NUM, DEN double *, double * monster, dubbel data_update, double * output, unsigned int length_output_data)

(unsigned char i;monster [4] = monster [3];

monster [3] = monster [2];

monster [2] = monster [1];

monster [1] = monster [0];

monster [0] = data_update;

/ / output buffer

for (i = length_output_data, i> 0; i -)

(

output = output [i-1];

)/ / update output data

output [0] = NUM [0] * monster [0] NUM [1] * monster [1] NUM [2] * monster [2] NUM [3] * monster [3] NUM [4] * monster [4]-DEN [1] * output [1]-DEN [2] * output [2]-DEN [3] * output [3]-DEN [4] * output [4];)

 
Er zijn triviaal C programmeertaal kwesties, denk ik.Ik zou in het algemeen voorstellen om uitvoering van het programma met een debugger te sporen om te controleren op plausibel operatie.
and 500*i/1000
may be executed first.

Een punt is dat in een uitdrukking als 2 * pi * 500 * i/1000 de compiler vrij is om de volgorde van uitvoering bepalen aan zijn behoeften, waardoor een integer expressies 500 * i
en 500 * i/1000
kunnen voor het eerst worden uitgevoerd.Men zou eventueel overflow veroorzaken, als geheel getal is 16 (u niet vertellen over de enviroement), de andere truncatie anyway.Schrijven (500.0f * i) of (float) i would correcte uitvoering te garanderen.

Het Oher punt is, dat lokale variabelen in een functie in het algemeen zijn geïnitialiseerde in C, zodat uw filter opslag elementen bevatten willekeurige valuesa het begin niet.

Tot slot, ik weet niet hoe de omvang component werkt, als het correct wordt gebruikt met de y-uitgang vector.

 
bedanken, FVM
I'm using VC ver6.0, en dat Scope, ik ben zeker dat het helemaal TRUE.Because, in mijn project gebruik ik een Active X-besturingselement dat kan maken Scope.

 
Er is duidelijk buffer overflow:
U gebruikt monster [4], maar de omvang van array x is vier toegestane index is 0,1,2,3, maar niet 4.
Ook ik Scope.Channels [0 denken]. Data.SetYData (y, 1000); / / draw signaal
worden na de lus te versnellen uitvoering.

 
FVM, de C-expressie 2 * pi * 500 * i/1000 is equivalent met (((2 * pi) * 500) * i) / 1000.
Als 'pi' is een dubbel, dan alles wordt gepromoveerd tot dubbele, dus er is geen gevaar voor de verdeling van twee gehele getallen.

 
Kernighan / Ritchie zegt dat een compiler vrij is om de volgorde * of operatoren in een expressie.Ook, * en / hebben gelijke prioriteit.Ik zie niet een regel die zou verbieden om i/1000 eerste beoordelen.Het kan zijn, dat VC6 heeft extra zichzelf beperkingen gedefinieerd om meer duidelijkheid te verschaffen aan programmeurs.

 
K & R2 sectie A.7.6 zegt: "De multiplicatieve operatoren *, / en% groep van links naar rechts."

Je mag denken van deze verklaring van K & R2 afdeling 2.12:
"C, zoals de meeste talen, niet nader bepaalt de volgorde waarin de operanden van een exploitant worden geëvalueerd."
Dat is een andere kwestie.

 

Welcome to EDABoard.com

Sponsor

Back
Top