Hallo! Hoffentlich kann mir einer helfen. Ich versuche gerade die Spannungswerte für eine Sinustabelle zu ermitteln. Irgendwie drehe ich mich bei der Berechnung im Kries. Die Formel ist doch y(t) = A*sin(w*t) mit A der Amplitude und w = 2 pi F . Angenommen ich habe 2.5 V Amplitude und eine Frequenz von 120 HZ dann folgt doch y(t) = 2.5 * sin(2* pi 120 t). Ich möchte jetzt zum Beispiel 64 Werte gleichmäßig verteilt über eine Periode aufnehmen. Bisher mach ich irgendetwas falsch ... kann mir jemand auf die Sprünge helfen wie es weitergeht. Danke
Hallo, die 64 Werte bekommst Du, wenn Du t von 0 bis T in Schritten von T/64 gehst. Wobei T = 1/f ist. Also T=1/120Hz=0,008333s mfg
Also: Eine Periode dauert bei 120Hz 1/120s. Wenn Du 64 Werte pro Periode haben möchtest, musst Du alle 1/(120*64)s einen Wert berechnen. => y(i) = 2.5 * sin(2 pi i/64) für i=0,1,2,...,63 Wie Du siehst, kürzt sich die Frequenz heraus. Das ist ja auch logisch, da eine Sinusschwingung unabhängig von der Frequenz immer die selbe Form hat. Welche Frequenz Du erhälst, bestimmst Du allein durch die Rate, mit der Du die Werte später "abspielst".
Das ist ja wohl Grundschulmathematik, oder? Eine Periode ist 2*pi. Der 120igste Teil von 2*pi ist 2*pi/120. In basic würde man das ungefär so ausdrücken: for i = 0 to 2*pi step 2*pi/120 y=sin(i)*a next i
Hallo ich weiß nicht ob dir das hilft oder ob du das meintest aber die 64 Werte erhälst du indem du 64 Werte für deine Zeit t einsetzt. Zum Beispiel t1=0 sec;t2=1 sec; usw. Daraus ergibt sich dann eine Sinuskurve. Willst du die Werte gleichmäßig über eine Periode verteilen dann musst du die eine Periode halt berechnen: w=2*pi*f=1/T wobei T die Periodendauer ist wenn du die durch 64 teilst bekommst du T/64 *1 = t1; T/64 *2 = t2; .... Hoffe ich konnte dir helfen Max
sorry, hab 120hz<->64 teilschritte verwechselt. Bitte tausch einfach die 120 mit der 64. Übrigens, da du nur 64 Teilschritte einer Periode haben möchtest, ist die Frequenz egal...
Hat jetzt nicht noch einer einen Assemblercode dafür? :-D Ich würde sagen, warte erst einmal, bis du das in der Schule hast.
Alles klar! Wie ich sehe seid ihr deutlich schlauer als ich! Vor allem der unbekannte. Aber warum tut es dann dieser C Code nicht ??? for(i=0;i<64;i++) { bogen = (((2*3.14)/64)*i)*(3.14/180); res = sin(bogen); printf("%.2f \n",res); fprintf(stream,"%.2f,\n",res); }
"Aber warum tut es dann dieser C Code nicht ???" Wahrscheinlich weil irgendwelcher Quatsch mit Typumwandlungen passiert. Dein Programmausschnitt ist völlig nichtssagend, denn Du hast die wichtigsten Informationen ausgelassen: Die Deklaration der einzelnen Variablen. Welche Typen haben i, bogen und res? Darauf kommt es an und da wird der Fehler liegen. (Der Algorithmus als solcher ist richtig.) Gruß, Michael
Nee, der Algorithmus ist leider auch falsch! Was soll der Term '*(3.14/180)' ? Gruß, Michael
#include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char *argv[]) { int i; double res; double bogen; FILE *stream; if((stream = fopen("sin_array.csv","w")) == NULL){ printf("\n\nERROR OPENING FILE - maybe file is in use by other program\n\n"); system("PAUSE"); exit(1);} for(i=0;i<64;i++) { bogen = (((2*3.14)/64)*i)*(3.14/180); res = sin(bogen); printf("%.2f \n",res); fprintf(stream,"%.2f,\n",res); } fclose(stream); system("PAUSE"); return 0; } Die Funktion sin() aus der math Bibliothek erwartet doch einen Winkel im Bogenmaß ... daher der zusätzliche Faktor.
Und was meinst Du, was 2*pi*(i/64) ist? Das ist doch schon Bogenmaß, sonst würdest Du schließlich 360*(i/64) schreiben.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.