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


von Oli D. (ziro-base)


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

von Unit* (Gast)


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.

von Oli.D (Gast)


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

von Frank (Gast)


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

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.