Forum: Mikrocontroller und Digitale Elektronik Basic in C übersetzen


von Gast (Gast)


Lesenswert?

Hallo an alle,

kann mir jemanden helfen das Basic Programm in c zu übersetzen?

von Sven P. (Gast)


Lesenswert?

welches denn?

von Gast (Gast)


Angehängte Dateien:

Lesenswert?

sorry ,
ich habe es nicht eingefügt!!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dateiformate

*.doc ist kein Quelltextformat.

von Karl H. (kbuchegg)


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.

von Gast (Gast)


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!!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist ein WORD-Dokument.

Noch ungeeigneter wäre eine PDF-Datei oder ein Bild vom Quelltext (als 
JPG oder was auch immer).

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

von Gast (Gast)


Lesenswert?

Habe schon fast alles im Netz durchgesucht .Leider war es noch 
komplezierter als ich dachte!!

von Gast (Gast)


Lesenswert?

An rufus
Ok ! ich verstehe es jetzt

von Peter D. (peda)


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

von der Böse :) (Gast)


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 :))

von Karl H. (kbuchegg)


Lesenswert?

Gast wrote:
> Habe schon fast alles im Netz durchgesucht .Leider war es noch
> komplezierter als ich dachte!!

Nichts für ungut, aber:
Warum bloss habe ich das Gefühl, du versuchst dich da an einer
Problemstellung die 5 Schuhnummern zu groß für dich ist?

von Gast (Gast)


Lesenswert?

Könnte er mir trotzdem jemanden das Programm mindestens zu verstehen?

Ich wäre natürlich sehr dankbar!!

von Karl H. (kbuchegg)


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).

von Benedikt K. (benedikt)


Lesenswert?

Vergiss das verstehen erstmal. Wichtig ist zu wissen, wie man es 
verwendet. Also welche Werte reingehen, und welche rauskommen, und was 
die bedeuten.

von Gast (Gast)


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.<

von Karl H. (kbuchegg)


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]

von Hannes L. (hannes)


Lesenswert?

Also die BASIC-Dialekte, die ich kenne, beginnen ihre Arrays mit Index 
0.

...

von Karl H. (kbuchegg)


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 :-)

von Gast (Gast)


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;

von Karl H. (kbuchegg)


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
}

von Gast (Gast)


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?

von Basis Basic (Gast)


Lesenswert?

Die meisten Basicdialekte kennen den Befehl

Option Base  = 0 oder Option Base  = 1

damit beginnen die Felder entweder mit 0 oder 1

von Ralf S. (spacedog) Benutzerseite


Lesenswert?

Basic - warum? warum nur?

von Gast (Gast)


Lesenswert?

danke zuerst für den Antwort!!

Ich finde momentan Schwierigkeiten bei der Anpassung des programm in C!
Ich versuche zu verstehen welche Variablen erkennt der Compiler !

von Gast (Gast)


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!!

von Basis Basic (Gast)


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!

von Bernd das Brot (Gast)


Lesenswert?

>Basic - warum? warum nur?

Dummes Gescwätze

von Gast (Gast)


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!!

von Norgan (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Basis Basic wrote:

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

Ähm, du hast dir aber schon mal das vom OP gepostete Programm
angesehen, oder?

Das ist BASIC der 80-er Jahre.

von Karl H. (kbuchegg)


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.

von Hannes L. (hannes)


Lesenswert?

Aua-ha, das war deutlich, so kenne ich Dich gar nicht... ;-)

Gruß in die Berge...

...

von Gast (Gast)


Lesenswert?

Ich habe es nämlich nochmal angeschaut ,die variablen kann ich auch 
anderes umbenenen ,die haben eigentlich keine mathematische Bedeutung

von Matthias Kölling (Gast)


Lesenswert?

Eine Variable kann man immer umbenennen. Ein Compiler kennt die 
mathematische Bedeutung einer Variablen nicht.

Gruß Matthias

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
Noch kein Account? Hier anmelden.