Basic in C übersetzen

#879831
Lesenswert?

Es gibt zwar Schlimmeres, aber diesen Spaghetticode muss
man erst mal aufräumen.

Allerdings: Sooo schlimm ist der Code dann auch wieder nicht.
Ein goto ist drinnen, der unmittelbar auf einen anderen if samt
goto führt. Über den müsste man etwas nachdenken, aber der Rest
übersetzt sich quasi von alleine. Alle Variablen mit einem %
hinten drann sind int, alles andere double. Und schon bist du
unterwegs.

Aber wozu nach C umsetzen? Fast Fourier Transformationen gibt es
doch auch in C im Web wie Sand am Meer. Man muss nur suchen.

PS: Musste das unbedingt sein, ein Basic-Programm in ein Word
Dokument einzubetten? Es gibt nur wenige Wahnsinnige wie mich,
die ein Word-Dokument aus dem Web einfach so aufmachen.
Gast #879838
Lesenswert?

Sorry,
ich glaube ich bin zu dummi dafür,
was heisst das(*.doc ist kein Quelltextformat.)
 Das Programm habe ich aus dem Buch vom Steven.W Smith (Digital Signal 
Processing) sollte zur berechnung vom FFT auf eienem Pic sehr gut 
geeignet ist.
Ich habe es versucht eigenes zu verstehen, aber klappt halt nichts!!
#879856
Lesenswert?

Gast wrote:

> was heisst das(*.doc ist kein Quelltextformat.)


Das heißt, wenn Du einem Compiler oder Basic ein *.doc fütterst, wird es 
Dich mit tonnenweise Fehlermeldungen überhäufen, aber nie compilieren.

Compiler mögen nur pure ASCII-Files ohne jede Formatierung.

Und die Endung entspricht dann dem Compiler, z.B.:

*.bas für Basic
*.c für C
*.asm für Assembler


Peter
Gast #879858
Lesenswert?

> Das ist ein WORD-Dokument.

> Das WORD-Dokument ist 26624 Bytes groß; der Nutzinhalt aber ist gerade
> mal 1418 Bytes groß.

das ist der "Microsoft-Effekt" :)

ist wie beim 'Hello World', das besteht aus

2 Prozent Hello und 98 Prozent Microsoft :))
#879899
Lesenswert?

Wenn ich mich nicht irgendwo gröber verhaut habe, dann müsste es
das eigentlich sein
1
#include <math.h>
2

3
void fft( int N, double* REX, double* IMX )
4
{
5
  // THE FAST FOURIER TRANSFORM
6
  //   Upon entry, N% contains the number of points in the DFT, REX[ ] and
7
  //   'IMX[ ] contain the real and imaginary parts of the input. Upon return,
8
  //   'REX[ ] and IMX[ ] contain the DFT output. All signals run from 0 to N%-1.
9

10
  double PI = 3.14159265;
11
  int    NM1 = N-1;
12
  int    ND2 = N/2;
13
  int    M   = int( log(N) / log(2.0) );
14
  int    J   = ND2;
15
  int    I, K, L, LE, LE2, JM1, IP;
16
  double SR, SI, TR, TI, UR, UI;
17

18
  for( I = 1; I <= N-2; ++i ) {
19
    if( I < J ) {
20
      TR = REX[J];
21
      TI = IMX[J];
22
      REX[J] = REX[I];
23
      IMX[J] = IMX[I];
24
      REX[I] = TR;
25
      IMX[I] = TI;
26
      K = ND2;
27
    }
28
    while( K <= J ) {
29
      J = J-K;
30
      K = K/2;
31
    }
32

33
    J = J+K;
34
  }
35

36
  for( L = 1; L <= M; ++L ) {
37
    LE = (int) ( 1 << L );
38
    LE2 = LE/2;
39
    UR = 1;
40
    UI = 0;
41
    SR =  cos( PI / LE2 );
42
    SI = -sin( PI / LE2 );
43

44
    for( J = 1; J <= LE2; ++J ) {
45
      JM1 = J-1;
46

47
      for( I = JM1; I <= NM1; I += LE ) {
48
        IP = I+LE2;
49
        TR = REX[IP]*UR - IMX[IP]*UI;
50
        TI = REX[IP]*UI + IMX[IP]*UR;
51
        REX[IP] = REX[I]-TR;
52
        IMX[IP] = IMX[I]-TI;
53
        REX[I] = REX[I]+TR;
54
        IMX[I] = IMX[I]+TI;
55
      }
56

57
      TR = UR;
58
      UR = TR*SR - UI*SI;
59
      UI = TR*SI + UI*SR;
60
    }
61
  }
62
}

Vom Basic übernommen wurde, dass der erste Nutzindex in den Arrays
jeweils 1 ist. D.h. da muss man bei einer Verwendung in C aufpassen,
dass die übergebenen Arrays immer um 1 größer definiert werden müssen.
Aber ein Umschreiben der Logik auf 0-basierte Arrays war mir jetzt
zuviel Aufwand. (Auch wenn der Original Kommentar was anderes
behauptet, denke ich, dass die Arrays hier 1-basiert verwendet
werden).
Gast #879916
Lesenswert?

Können sie es mir bitte villeicht noch besser erklären (Danke)

>Vom Basic übernommen wurde, dass der erste Nutzindex in den Arrays
jeweils 1 ist. D.h. da muss man bei einer Verwendung in C aufpassen,
dass die übergebenen Arrays immer um 1 größer definiert werden müssen.
Aber ein Umschreiben der Logik auf 0-basierte Arrays war mir jetzt
zuviel Aufwand.<
#879923
Lesenswert?

Gast wrote:
> Können sie es mir bitte villeicht noch besser erklären (Danke)
>

Eigentlich sollte ich nicht. :-)
Das ist C-Grundlagenwissen

In C ist der erste Array index eine 0.
D.h. ein Array A mit 5 Elementen hat die Elemente
 A[0], A[1], A[2], A[3], A[4]    (zähl nach: sind 5 Stück)

In den meisten Basics, beginnt die Zählerei aber bei 1
D.h. ein Array B mit 5 Elementen hat die Elemente
B[1], B[2], B[3], B[4], B[5]     (zähl wieder nach: sind wieder 5 Stück)

Wenn der C-Code also auf B[5] zugreifen will, dann sollte besser
sicher gestellt sein, dass das Array auch wirklich eine Element
mit dem Index 5 hat. Das hat es aber nur, wenn man es als Array
mit 6 Elementen definiert

  int B[6];

jetzt gibt es  B[0], B[1], B[2], B[3], B[4], B[5]
#879933
Lesenswert?

Hannes Lux wrote:
> Also die BASIC-Dialekte, die ich kenne, beginnen ihre Arrays mit Index
> 0.

Hmm. Ich kenns wieder anders rum :-)
Aber egal. Im Originalcode sind mir zuviele FOR Schleifen,
die mit
   FOR irgendwas = 1 TO ....
codiert sind. Daraus schliesse ich, dass die Arrays bei 1 anfangen.

Sicher weiss ich es allerdings nicht, schon möglich dass ich
falsch liege. Der OP hat ja jetzt eine Basisimplementierung
mit der er arbeiten kann :-)
Gast #879939
Lesenswert?

kann man nicht der erste Array mit 0 initialisieren, dann fangen mit dem 
vektor 0?
  >for( I = 1; I <= N-2; ++i ) {
    if( I < J ) {
      TR = REX[J];
      TI = IMX[J];
      REX[J] = REX[I];
      IMX[J] = IMX[I];
      REX[I] = TR;
      IMX[I] = TI;
      K = ND2;
Im ursprung programm steht
THEN GOTO 1190 heisst es nicht man springt direkt um Befehl 1190 in 
diesem Fall hier: K = ND2;
#879953
Lesenswert?

Gast wrote:

> Im ursprung programm steht
> THEN GOTO 1190 heisst es nicht man springt direkt um Befehl 1190 in
> diesem Fall hier: K = ND2;

Yep. Mein Fehler
1
#include <math.h>
2

3
void fft( int N, double* REX, double* IMX )
4
{
5
  // THE FAST FOURIER TRANSFORM
6
  //   Upon entry, N% contains the number of points in the DFT, REX[ ] and
7
  //   'IMX[ ] contain the real and imaginary parts of the input. Upon return,
8
  //   'REX[ ] and IMX[ ] contain the DFT output. All signals run from 0 to N%-1.
9

10
  double PI = 3.14159265;
11
  int    NM1 = N-1;
12
  int    ND2 = N/2;
13
  int    M   = int( log(N)/LOG(2.0) );
14
  int    J   = ND2;
15
  int    I, K, L, LE, LE2, JM1, IP;
16
  double SR, SI, TR, TI, UR, UI;
17

18
  for( I = 1; I <= N-2; ++i ) {
19
    if( I < J ) {
20
      TR = REX[J];
21
      TI = IMX[J];
22
      REX[J] = REX[I];
23
      IMX[J] = IMX[I];
24
      REX[I] = TR;
25
      IMX[I] = TI;
26
    }
27
    K = ND2;
28

29
    while( K <= J ) {
30
      J = J-K;
31
      K = K/2;
32
    }
33

34
    J = J+K;
35
  }
36

37
  for( L = 1; L <= M; ++L ) {
38
    LE = (int) ( 1 << L );
39
    LE2 = LE/2;
40
    UR = 1;
41
    UI = 0;
42
    SR =  cos( PI / LE2 );
43
    SI = -sin( PI / LE2 );
44

45
    for( J = 1; J <= LE2; ++J ) {
46
      JM1 = J-1;
47

48
      for( I = JM1; I <= NM1; I += LE ) {
49
        IP = I+LE2;
50
        TR = REX[IP]*UR - IMX[IP]*UI;
51
        TI = REX[IP]*UI + IMX[IP]*UR;
52
        REX[IP] = REX[I]-TR;
53
        IMX[IP] = IMX[I]-TI;
54
        REX[I] = REX[I]+TR;
55
        IMX[I] = IMX[I]+TI;
56
      }
57

58
      TR = UR;
59
      UR = TR*SR - UI*SI;
60
      UI = TR*SI + UI*SR;
61
    }
62
  }
63
}
Gast #881012
Lesenswert?

Hallo,
ich versuche es gerade zu verstehen das Vorherige Übersetztes 
Programm.Kann ich aber leider nicht alles nachvollziehen.

haben hier die variablen SR,SI,TR,... irgendwelche besondere bedeutung?
Gast #881072
Lesenswert?

>Basic - warum? warum nur?

Das Programm in Basic ist momentann für mich die Perfekte Lösung für die 
Berechnung vom FFT auf dem Pic!!

>Warum:Bit Reversal Algorithmus, Butterfly Berechnung
Ich bin halt kein Profi, aber ich versuche mein Bestens zu geben!!
Gast #881076
Lesenswert?

.. Weil Basic eine leicht zuverstehende Syntax besitzt und anderen
Hochsprachen in nichts nachsteht ...

Hocheffiziente Compiler, Objekt - bassierende Prog.

du Darfst das Basic aus den '80ern nicht mit VB6 oder gar dem  für
.net vergleichen!!

Ich will hier aber nicht wieder eine sinnlose Diskussion lostreten!
Gast #881088
Lesenswert?

sinnlose Diskusionen halte ich nichts davon!!

Ich will Bloß nur weiter gehlofen werden. Ich glaube ihr kennt dat schon 
wenn man nicht weiterkommt?

Also ich versuche gerade mein Programm in c anzupassen!!
Gast #881096
Lesenswert?

> ich versuche es gerade zu verstehen das Vorherige Übersetztes
> Programm.Kann ich aber leider nicht alles nachvollziehen.
>
> haben hier die variablen SR,SI,TR,... irgendwelche besondere bedeutung?

Ja, haben sie. Ohne die mathematischen Grundlagen der FFT und den 
Algorithmus zu kennen wirst du die allerdings nicht verstehen. Und es 
würde mich sehr wunder, wenn sich hier jemand die Zeit nimmt, ein Essays 
über die FFT für Leute ohne Vorkenntnisse zu schreiben.

Zum Einstieg: 
http://de.wikipedia.org/wiki/Schnelle_Fourier-Transformation
#881124
Lesenswert?

Norgan wrote:
>> ich versuche es gerade zu verstehen das Vorherige Übersetztes
>> Programm.Kann ich aber leider nicht alles nachvollziehen.
>>
>> haben hier die variablen SR,SI,TR,... irgendwelche besondere bedeutung?
>
> Ja, haben sie.

Für den OP:

Kleiner Tip. Bei einer FFT gibt es den 'Realteil' einer Zahl
und den 'Imaginärteil' einer Zahl. Also R und I

Und jetzt gibt es einige Variablen, die heissen zb SR und SI
bzw. TR und TI

Ein Schelm wer böses dabei denkt, dass das R bzw. I in SR bzw. SI
irgendetwas bedeuten könnte.

Ansonsten schliesse ich mich Norgan an.
Ein Programm aus einem Buch zu klauen ist eine Sache. Es von
jemandem übersetzen zu lassen ist eine andere Sache. Aber:
Das alles hilft dir nichts, wenn du (wahlweise)
* keine Ahnung von Basic hast
* keine Ahnung von C hast
* keine Ahnung von Programmieren hast
* keine Ahnung von einer FFT hast.
Wenn du bei den Punkten aus dieser Liste mindestens 2 mal
Kopfnicken musst, dann hast du schon verloren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren