www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP (bel.) Signal mit konstanter Frequenz abtasten


Autor: Oli D. (ziro-base)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich hoffe, dass ich hier richtig bin und mir eventuell jemand einen Tip 
geben kann.
So, da mir gerade mal wieder langweilig ist, hab ich beschlossen an 
einem meiner alten Projekte weiter zu basteln.

Wie im Betreff angedeutet geht es im weitesten Sinne um die Abtastung 
eines Signals bei konstanter Abtastfrequenz. (Dass natürlich nicht 
beliebige Signale, sondern nur Signale in bestimmten Rahmenbedingungen 
abgetastet werden können ist mir schon klar. Nyquist, einschränkungen 
durch den DSP, ... )

Es geht um Folgendes:

Ich habe ein Programm(C++) geschrieben das alle 4ms (250Hz) einen neuen 
Signalwert(periodisches Signal) aus einer Datenbank abruft und diesen 
dann weiter verarbeitet.

Die Datenbank benutze ich, damit ich nur einmal Rechenzeit für die 
Berechnung der Signalwerte aufwenden muss.

Die Signalwerte die in der Datenbank stehen, berechne ich Anhand der 
Funktion eines Signals.(Im einfachsten Fall bspw. Sinusfunktion). Die 
Frequenz eines Signals kann zwischen 0,1Hz - 30Hz liegen (0,1Hz 
Schritte).

Bisher berechne ich mir das KgV zwischen Abtastzeit(4ms) und 
Signalfrequenz und kann dann daraus ermitteln wieviele Werte ich in der 
Datenbank speichern muss, um für jeden Abtastzeitpunkt einen korrekten 
Signalwert bereitstellen zu können. Die Krugs an der Sache ist nun dass, 
das u.U sehr viele Signalwerte sein können und je nach verwendetem 
Datentyp (char, int,float,double) der benötigte Speicherplatz sehr gross 
werden kann(relativ gesehen).

Meine Frage ist nun wie ich die Anzahl der gespeicherten Werte 
reduzieren kann ohne einen Informationsverlust zu haben. Kann mir hierzu 
jemand einen Tip, Link, Schlagwort ... geben???
Die Werte die ich in der Datenbank speichere, müssen nich Absolutwerte 
sein, sondern können auch irgendeine andere Aussage/Funktion 
besitzten!!!)

Ich hoffe ich konnte mein Problemchen einigermassen rüberbringen!!!

Vielen Dank im vorraus!!!

Ach so... UND FROHE OSTERN!!

Mfg ziro

Autor: Unit* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie viele Perioden speicherst du?
Ich nehme an, dass deine Signale periodisch sind (.1 .. 30 Hz). Du musst 
zwei Dinge beachten: es reicht ein bisschen schneller, als 60 Hz 
abzutasten, und eine ganze Periode des langsameren Signal muss 
gespeichert werden.
Also um ein 1/.1 = 10s langes Signal mit 60+ Hz auszulesen brauchst du 
10*60+ z.B. 2^10=1024 Abtastwerte.
Wenn ein Abtastwert z.B. 16 bit groß ist, dann benötigt man 2 kB 
Speicher.

Autor: Oli.D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Unit*,

zunächst mal vielen Dank für deine Antwort. Deine Antwort ist in sich 
schlüssig und gibt meinen derzeitigen Kenntnisstand wieder.

Ich hatte gehofft, dass ich die Anzahl der zu speichernden Werte 
irgendwie reduzieren kann. Sieht aber leider so aus als ob das nicht 
möglich wäre..

Naja schade, dann muss ich halt den Speicherplatz opfern.....

Nochmals Danke für deine Mühen...

Mfg ziro

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Oli,

für Dein Problem gibt es zwei Möglichkeiten, zwischen denen Du Dich 
entscheiden kannst. Das heißt aber, Du mußt weder die eine noch die 
andere wählen - es gibt auch Lösungen dazwischen.

1. Variante:
Das ist die, die Du gewählt hast. Diese erfordert kaum (eigentlich 
keine) Rechenleistung zur Laufzeit.

2. Variante:
Du legst nur soviele Werte einer Periode ab um dem Abtasttheorem zu 
entsprechen und berechnest zur Laufzeit die Zwischenwerte über 
Interpolation und Decimation. Dazu sind FIR-Filter erforderlich und ein 
erheblicher Rechenaufwand. Der Speicheraufwand für Deine Signalsamples 
ist minimal.

Zwischenweg:
Um so mehr Werte Du ablegst, um so geringer wird der Rechenaufwand zur 
Laufzeit.
Wenn Du "Decimation and Interpolation" verstanden hast - dann kannst Du 
für Dich den günstigsten Kompromiss aus Rechenleistung und Speicher 
wählen. Eines von beidem mußt Du aber spendieren. (Remember: There is no 
free Lunch!)

Viel Spaß

- Frank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.