i need a FFT routine for bascom avr , atmega128

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • New

      Hallo wimapon,

      attached you find a FFT-Basic snippets, I hope its that what you want.

      BASCOM Source Code: FFT-Schnipsel

      1. '( FFT-Basic Parts
      2. without Assembler-Routines
      3. 15.02.2020 /17:00
      4. ')
      5. $regfile = "m644def.dat"
      6. $crystal = 20000000 '20MHz
      7. $hwstack = 100
      8. $swstack = 100
      9. $framesize = 100
      10. '$sim
      11. $baud = 56000
      12. Dim Re(130) As Single 'Real-Teil vor FFT-Berechnung
      13. Dim Im(130) As Single 'Imag-Teil vor FFT-Berechnung
      14. Dim Real(130) As Word 'Betragswerte nach FFT-Berechnung
      15. Dim Wcos(130) As Single 'Cosinus Werte für FFT
      16. Dim Wsin(130) As Single 'Sinus Werte für FFT
      17. Dim Pi As Single
      18. Dim Mr As Integer
      19. Dim N As Word 'FFT-Punkteanzahl
      20. Dim Nn As Integer
      21. Dim L As Integer
      22. Dim M As Integer
      23. Dim Tr As Single
      24. Dim Ti As Single
      25. Dim Istep As Integer
      26. Dim A As Single
      27. Dim Wr As Single
      28. Dim Wi As Single
      29. Dim I As Integer
      30. Dim J As Integer
      31. Dim Tr0 As Single
      32. Dim Tr1 As Single
      33. Dim Ti0 As Single
      34. Dim Ti1 As Single
      35. Dim Nm As Integer
      36. Dim W_cond As Integer
      37. Dim Ptr As Integer
      38. Dim Re1 As Single
      39. Dim Im1 As Single
      40. Dim Re_betrag As Single
      41. Dim N2 As Byte 'FFT-Ergebnis, N-halbe Slots
      42. Dim Freq As Word 'Frequenzvorgabe für Testsinus
      43. Dim Abtast_dauer As Single 'Abtastdauer für Testsinus
      44. Dim Sin_input(128) As Single 'Speicherplatz für Testsinus
      45. Dim F_steps As Single 'Frequenzsteps für Testsinus
      46. Dim Step_radian As Single 'Steps in Rad
      47. Dim Schritt As Single 'Schrittweite für Testsinus
      48. Dim Sinuswert As Single
      49. Freq = 313 'Frequenz-Vorgabe für Test-Sinus-Berechnung in Hz
      50. 'Print "with Simulator, wait a while, calculating results"
      51. Declare Sub Fft
      52. Pi = 4 * Atn(1)
      53. N = 128 'Anzahl Punkte der FFT
      54. N2 = N / 2 'N-halbe
      55. '###################################################################
      56. '---------------only for Test-Sinus ----------------
      57. Schritt = 0
      58. Abtast_dauer = 0.000125 'Abtast-Takt, hier 125usec
      59. F_steps = 1 / Freq 'Anzahl Steps pro Schwingung mit Abtastdauer
      60. F_steps = F_steps / Abtast_dauer
      61. Step_radian = 2 * Pi 'Anzahl Steps pro Schwingung bezogen auf 1 Radian
      62. Step_radian = Step_radian / F_steps
      63. 'Print "Step_radian=" ; Step_radian ; " F_steps=" ; F_steps
      64. '---------------Test-Sinus ----------------
      65. For I = 1 To N 'Generierung von Sinus-Werten zum Testen
      66. Sinuswert = Sin(schritt)
      67. Sin_input(i) = 400 * Sinuswert
      68. Schritt = Schritt + Step_radian
      69. '-------------------------
      70. Re(i) = Sin_input(i) 'Realpart, here filled with Test Sinus Values
      71. Im(i) = 0
      72. '-------------------------
      73. 'Print "I=";i;" Re =";Re(i)
      74. Next
      75. '####################################################################
      76. ' ------ Start -----------
      77. 'Vorgelagerte Cos- und Sin- Berechnung
      78. 'may definied as a Sub
      79. L = 1
      80. Nm = N
      81. While L < N '
      82. Istep = 2 * L
      83. For M = 1 To L
      84. Ptr = M + L
      85. A = 1 - M
      86. A = A / L
      87. A = A * Pi
      88. A = A * -1 'A=-Pi*(1-M)/L
      89. Wcos(ptr) = Cos(a)
      90. Wsin(ptr) = Sin(a)
      91. Wsin(ptr) = Wsin(ptr) * -1 '-sin(a)
      92. 'Print "Ptr=" ; Ptr ; " Cos=" ; Wcos(ptr) ; " Sin=" ; Wsin(ptr)
      93. Next M
      94. L = Istep
      95. Wend
      96. Fft
      97. '----FFT-Results with Test Sinus
      98. For I = 1 To N2 '
      99. Re1 = Re(i) * Re(i) 'Re(i) zum Quadrat
      100. Im1 = Im(i) * Im(i)
      101. Re_betrag = Re1 + Im1
      102. Re_betrag = Sqr(re_betrag)
      103. Re_betrag = Re_betrag / 4 'reduzieren, da Wert > als 65536 sein kann
      104. Real(i) = Re_betrag 'Betragswert
      105. Print I ; " " ; Real(i) 'Betragswert-Ausgabe der einzelnen FFT-Slots
      106. Next I
      107. Real(1) = 0 '#####!!!!Gleichanteil zu Null gesetzt!
      108. '######################################
      109. End
      110. Sub Fft
      111. Mr = 0
      112. Nn = N - 1
      113. For M = 1 To Nn
      114. L = N
      115. L = L / 2 'Shift L , Right , 1 ' = L / 2
      116. W_cond = Mr + L
      117. While W_cond > Nn
      118. L = L / 2 'Shift L , Right , 1 ' = L / 2
      119. W_cond = Mr + L
      120. Wend
      121. Mr = Mr Mod L 'Mod_argu
      122. Mr = Mr + L
      123. 'Mr = Mr
      124. If Mr > M Then
      125. Tr = Re(m + 1)
      126. Re(m + 1) = Re(mr + 1)
      127. Re(mr + 1) = Tr
      128. Ti = Im(m + 1)
      129. Im(m + 1) = Im(mr + 1)
      130. Im(mr + 1) = Ti
      131. End If
      132. Next M
      133. L = 1
      134. Nm = N
      135. While L < N '
      136. Istep = 2 * L
      137. For M = 1 To L
      138. Ptr = M + L
      139. Wr = Wcos(ptr) 'cos(a)
      140. Wi = Wsin(ptr) 'Sin(a)
      141. For I = M To N Step Istep
      142. J = I + L
      143. Tr0 = Wr * Re(j)
      144. Tr1 = Wi * Im(j)
      145. Tr = Tr0 - Tr1 'ZR=CO*RE(J) - SI*IM(J)
      146. Ti0 = Wr * Im(j)
      147. Ti1 = Wi * Re(j)
      148. Ti = Ti0 + Ti1 'ZI=CO*IM(J) + SI*RE(J)
      149. Re(j) = Re(i) - Tr
      150. Im(j) = Im(i) - Ti
      151. Re(i) = Re(i) + Tr
      152. Im(i) = Im(i) + Ti
      153. Next I
      154. Next M
      155. L = Istep
      156. Wend
      157. End Sub
      Display All
    • New

      Hallo Stefanhamburg,


      noch einige Gedanken zu deinem Bannstrahl bzgl. der Verwendung der englischen Sprache von Hilfe-Suchenden in diesem Forum:

      • anscheinend wird dieses Forum als hilfreicher angesehen!?
      • Bascom sowie Bascom-Hilfe und auch alle Datenblätter zu den AVR’s sind ohne Englisch-Kenntnisse kaum sinnvoll anwendbar.
      • Es wird sich somit niemand mit AVR’s beschäftigen wollen, der nicht auch (minimale) Sprachkenntnisse in Englisch besitzt.
      • Die Problemanfragen in deutscher Sprache erfordern schon oftmals Nachfragen vom Tenor „…was ist damit gemeint…“. Übersetzer-Algorithmen sind eher nicht auf technische Belange optimiert, sodass noch mehr Verwirrung bei der Hin- und Rückübersetzung entstehen könnte.
      • Im Sprachgebrauch hier werden ebenfalls Begriffe wie „Thread“ verwendet. Eine strenge deutsche Übersetzung könnte auch „Faden“ bedeuten. (nach deepl-Translator)
      • Wie groß ist der Anteil der in Englisch gestellten Anfragen bezogen auf die Fülle derer in deutscher Sprache, ich vermute mal, er liegt im niedrigen einstelligen Prozent-Bereich?

      Auch ich bin ein Verfechter meiner Muttersprache und ärgere mich jedes Mal, wenn gehäuft Anglizismen im Blätterwald auftauchen. Allerdings sehe ich es bei technischen Bereichen und Anwendungen differenzierter, da in diesem Bereich deutsch leider kaum zur Anwendung kommt.


      Deshalb würde ich solche in Englisch notierten Anfragen etwas weniger streng betrachten; eher bereichert es dieses ausgezeichnete Forum.

      In einem Buch von 2010 las ich auf Seite 14 u.a. „Ziel ist es dem Anfänger die Scheu vor dem Einstieg zu nehmen“. Das kann ich voll und ganz unterstützen, wenn ich auch auf meine Anfänge zurückblicke.


      Diese Gedanken sind nur meine persönliche Meinung, andere Meinungen werden aber auch akzeptiert.


      Gruß

      Ulrich
    • New

      hallo wieder Ulrich,
      Ich kan ein bischen deutch sprechen, aber die deutche computer worten kan ich nicht verstehen.
      Darom versuche ich es auf englisch.......

      Ich will jedenfalls kein probleem sein auf diezes forum

      I think that your last snipet does the job for me.
      I did some experiments with it , and the results looks great.

      When i am ready and i can use this program for my other experiments i will inform you here.

      Until sofar, thank you 1000 times for your wonderfull help

      Wim PA0SLT

      PS If you like to know who you helped, look at my sites:
      home.kpn.nl/huiu55wi/huis.htm
      ebl21.nl

      at the moment i am trying to make a seismic earthquakes measuring station here at my house.
      We do suffer lots of earthquakes here due to gas production.
      The problem is that my sensor gets to much 50 Hz noise.
      Because i need a greater sensitivity i need a FFT routine to see the difference between an
      ordinary 50 Hz noise puls and a real earthquake.
    • New

      Es ist kein Problem, wenn hier einer auf Englisch fragt.
      Keiner hat hier was dagegen und die meisten können es auch lesen.

      Das Problem ist, dass die Antworten der User in einem deutschen Forum nur von den Leuten kommen, die auch englisch schreiben (können)
      Das sind nicht unbedingt die gleichen Leute, die eine Lösung haben.

      Der Fragende bekommt also nicht die größtmögliche Aufmerksamkeit und auch nicht die Spezialisten.
      Das ist in einem englisch-sprachigem Forum eben anders.
      Und genau das hat Stefanhamburg gemeint.
      Kein Bannstrahl a_45_132ca9f5
    • New

      Michael wrote:

      Der Fragende bekommt also nicht die größtmögliche Aufmerksamkeit und auch nicht die Spezialisten.
      Das ist in einem englisch-sprachigem Forum eben anders.
      scheint eben nicht so zu sein, sonst würde er es nicht hier probieren. Ist doch eigentlich klar, dass ich in das Forum gehe, das ich am besten lesen/verstehen kann. Nur wenn ich da nicht weiter komme, dann mach ich mir die Mühe in einem anderssprachigen Forum. Ich sehe die englischen Anfragen eher als ein Anzeichen für die Qualität dieses Forums.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • New

      Hallo wimapon,

      according to your homemade seismic earthquakes measuring station: did you built the sensor(s) yourself? It is possible you give some information about the sensors? How to built? schematics?

      In my vicinity there have also been drillings for gas, which have generated light earthquakes too.

      Ulrich
    • New

      Hi Ulrich,
      As sensor i do use a LIS332AR 3-axis +/-2g analog-output ultracompact accelerometer.
      After that i du use a low frequency amplifier with a LM324

      I do have much noise coming from this thing... so i have difficulties to see the difference
      between an week earthquake and the continuous noise.
      Therfore i am now experimenting with the FFT in the AVR program.

      In the begining i did use an ordinary loudspeaker with a stone on the conus.
      that worked very good. the stone must not be to heavy... the conus must
      be somewhere in the middle of the movement range.....
      The output of that loudspeaker was connected to the ADconvertor input of the AVR.

      I am a retired geologist. I was working in oil and gas exploration with seismic interpretation.
      So i do know something about earth quakes and seismics.

      If i can help you, i will do!

      Wim
    • New

      Hallo Wimapon,

      many thanks for that informations. I have already read the sensor example using a loudspeaker in one of the popular electronic magazines. I will test that too. Do the noise come from the accelerator or from the LM324?

      Here in this Bascom-Forum many users have shown programs to communicate with different 3/6-axis accelerators, e.g. MPU6050.

      MPU-6050 MEMS 6-Achs-Sensor

      May be it is of interest too. Search for this theme. Everything else in a PN.

      Ulrich