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
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...
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
#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.
Eine eigene Frage?
Dieser Thread ist über 21 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.