Forum: Digitale Signalverarbeitung / DSP / Machine Learning FIR in C programmieren


von Matt (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend,

ich bin gerade dabei einen FIR Filter in C zu programmieren.
Wie kann man diese Gleichung siehe Anhang in ein C Programm 
implementieren?

von 2921 (Gast)


Lesenswert?

Was das steht hast du begriffen ? Wo ist die Schwierigkeit ? Bei der 
Mathe oder beim C ?

von tom (Gast)


Lesenswert?

da steht nix anderes als

y(k) = a(0)*x(k) + a(1)*x(k-1) + a(2)*x(k-2) + ... + a(i)*x(k-i)

du musst einfach nur deinen aktuellen digitalisierten wert x(k) mit 
filterkoeffiezient a(0) multiplizieren, den um eine abtastperiode 
zurückliegenden wert x(k-1) mit filterkoeffizient a(1) usw. zum schluss 
alles aufsummieren und als ergebnis y(k) abspeichern.

von Matt (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab es mal gestern Abend noch probiert. Bin da nicht weitergekommen.
Zuerst tue ich alle x-Werte spiegeln bzw. drehen. Dann summiere ich auf. 
Irgendwie ist der Code misst.

von Hannes (Gast)


Lesenswert?

Kann es sein das mit dem Stern die Faltung gemeint ist und nicht 
Multiplikation?

von Helmi (Gast)


Lesenswert?

Schau mal hier

Hier kannst du dir eine Software downloaden die dir direkt C - Code
generiert

http://www.winfilter.20m.com/

Gruss Helmi

von Matt (Gast)


Lesenswert?

Hat niemand von euch schonmal so einen FIR Filter in C programmiert?

Der Stern bedeutet hier eine Multiplikation.

von ----- (Gast)


Lesenswert?

Vielleich kannst du damit was anfangen.
1
public double[] Fir(double[] x, double[] a)
2
{
3
  double[] y = new double[x.Length - a.Length];
4
  for (int k = 0; k < y.Length; k++)
5
  {
6
    for (int i = 0; i < a.Length; i++)
7
      y[k] += a[i] * x[k + i];
8
  }
9
  return y;
10
}

von tom (Gast)


Lesenswert?

@ ----:
du hast nen fehler im code. es müsste in der zweiten for-schleife heißen
y[k] += a[i] * x[k - i];
sonst läufst du aus dem x[]-Array raus.

@Hannes:
könnte sein dass mit * die Faltung gemeint ist, aber so auf den ersten 
Blick würde ich sagen, dass ein FIR bzw. IIR doch meistens nur aus 
Addition und Multiplikation besteht so dass ich jetzt auf Multiplikation 
tippe.

von Gast (Gast)


Lesenswert?

Faltung ist ein Vorgang der zu FFT gehört.
Bei IIR- unf FIR-Filter gibt es keine Faltung,
sondern nur Multiplikation und Addition.
Die meisten CPU-Hersteller haben Applikations-
beispiele zur FIR und IIR in C. Einfach mal
dort nachschauen.
Vorsicht bei der AVR Application Note zu IIR -
da steckt ein Fehler drin.

von Gunb (Gast)


Lesenswert?

@Gast:

Faltung ist eine mathematische Operation, die zur Ermittlung der 
Ausgangsfunktion bei gegebener Übertragungsfunktion eines Systems und 
der  am Eingang des Systems anliegenden Eingangsfunktion dient.

Der Faltung im Zeitbereich entspricht nach Fourier-Transformation die 
Multiplikation im Frequenzbereich. Das hat erst einmal nichts mit der 
Fast Fourier Transformation zu tun, sondern ist eine allgemeine 
Operation.

Dasselbe mit Laplace, da Fourier der Laplace-Transformation auf der 
imaginären Achse entspricht.

Mit FFT hat das nur nebensächlich zu tun, die Faltung ist im allgemeinen 
zur Systembeschreibung in der Nachrichtentechnik und der 
Regelungstechnik nötig.

Die FFT wird angewendet, um die Rechenzeit auf Controllern oder DSPs zu 
minimieren.

Zum Falten zweier Funktionen ist die Transformation in den 
Frequenzbereich nicht unbedingt notwendig, vereinfacht die Sache aber 
eventuell dadurch, dass im F-Bereich der Faltung die Multiplikation 
entspricht. Bei Verwendung von Tabellen oder bekannten einfachen 
Faltungen kann auf die Fourier-Transf. aber auch verzichtet werden.

Nur der Vollständigkeit und Richtigkeit halber.

Gruss
Gunb

von Gast (Gast)


Lesenswert?

@Gunb
Weiter oben wurde gemutmaßt, es könnte sich bei dem
Operator * um Faltung handeln.
Faltung benutze ich in FFT, aber nicht in FIR und IIR.
Mehr wollte ich nicht sagen.
Deinen Ausführungen habe ich nichts hinzuzufügen, außer
dass sie mit meiner Aussage nicht im Widerspruch stehen.

von Thomas (Gast)


Lesenswert?

@Gast:
schreib doch hier bitte nicht über Dinge, von denen du gar keine Ahnung 
hast!
Eine diskrete Faltung im Zeitbereich besteht nur aus Multiplikationen 
und Additionen.
Und ein FIR-Filter ist eine Faltung!
Die Formel ganz oben lässt sich auch als Faltung ausdrücken:

von Gast (Gast)


Lesenswert?

@Thomas
Danke für die Aufklärung, dass der Operator "*" oben
nicht für eine Multiplikation steht, sondern für eine
Faltung.

von Matt (Gast)


Lesenswert?

1
public double[] Fir(double[] x, double[] a)
2
{
3
  double[] y = new double[x.Length - a.Length];
4
  for (int k = 0; k < y.Length; k++)
5
  {
6
    for (int i = 0; i < a.Length; i++)
7
      y[k] += a[i] * x[k + i];
8
  }
9
  return y;
10
}

Die berechneten Werte werden ja in dem double Array y abgelegt.
Anschließend müssen doch noch alle Werte in dem Array aufsummiert 
werden.
Ist das korrekt so?

von ----- (Gast)


Lesenswert?

Die Funktion Fir funktioniert schon, da gibt es keinen Überlauf. Denn 
der Index k geht nur bis x.Length - a.Length. Ist vielleich nicht sehr 
elegant funktioniert aber.

Die Funktion Faltet x mit a als Resultat erhälst du eine neue Funktion 
y, da muss nichts aufsummiert werden.

von Thomas (Gast)


Lesenswert?

Ach Gast, jetzt stell dich doch bitte nicht noch dümmer, als du bist.
Niemand hier hat was gegen dumme Fragen oder Mutmaßungen, aber hier 
grobe Falschaussagen zu einem Thema von dem man offenbar nicht allzu 
viel versteht als Fakt darzustellen ist nicht lustig. Kein Grund hier 
den Trotzkopf zu spielen.


http://de.wikipedia.org/wiki/Faltung_%28Mathematik%29
http://de.wikipedia.org/wiki/Schnelle_Faltung

von Noch ein Gast (Gast)


Lesenswert?

Bevor hier noch mehr verwirrung aufkommt:

Der FIR-Filter ist eine Faltung im Zeitbereicht.
Die Rechenvorschrift oben ist sozusagen diese Faltungssumme.
Das '*' ist hier aber eine Multiplikation.

von Unbekannt (Gast)


Lesenswert?

Es ist eine Faltung von zeitdiskreten Signalen nicht zu verwechseln mit 
kontinuierlichen Signalen(obwohl da eine gewisse Analogie besteht).

Man faltet also zwei Folgen a[n] und x[n] miteinander im "Zeitbereich 
(genauer im Zeitdiskreten Bereich) und bekommt y[n]. Das mit dem * ist 
eine Multiplikation da eine Faltung im Zeitbereich IMMER eine 
Multiplikation ist, weil man sonst nicht im Zeitbereich falten könnte, 
ich werde das jetzt auch nicht näher Begründen weil es einfach 
mathematisch so ist!!!!!!

Das * dient eigentlich zu Symbolik das man es mit einer Faltung zu tun 
hat hier ein Bsp. y(t)=(g*f)(t) Funtkion g wird mit Funtkion f gefaltet 
mehr bedeutet das nicht, das blöde ist nur das man mit den 
Schreibporgrammen das Malzeichen auch mit * darstellt, deshalb kommt es 
hier zu Irrtümern.


Hier nochaml ein Überblick: für zeitkontinuierliche und zeitdiskrete 
Signale gibt es Zwei Möglickeiten um auf die Lösung zu kommen.


Zeitkontinuierliches Signal ---> 1.Laplace ---> Rücktransformation
                                 2.Faltung mit corelation "Integral"

Zeitdiskretes Signal        ---> 1.z-Transformation ---> Rücktransform.
                                 2.Faltung über die "Summenbildung"
                                   (das was du oben abgebildet hast)




Vielleicht hilft dir auch das Programm unten weiter.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
long int a[100];
5
long int b[100];
6
long int cM[100][100];
7
long int c[100];
8
9
int n;
10
int k;
11
int i;
12
13
int main(int argc, char *argv[])
14
{
15
16
 //Faltung von Folgen im Zeitdiskreten-Bereich
17
18
  for(n=0; n<=20; n++) 
19
  {
20
     for(k=0; k<=20; k++)
21
      {
22
           
23
           //Folge a[n]
24
           a[0]=0;
25
           a[1]=1;
26
           a[2]=1;
27
           a[3]=1; 
28
           a[4]=0; 
29
           a[k+5]=0; //Rest = 0
30
          
31
          
32
           //Folge b[n]
33
           b[0]=0;
34
           b[1]=1;
35
           b[2]=1;
36
           b[3]=0; 
37
           b[4]=0; 
38
           b[k+5]=0; //Rest = 0                
39
          
40
          
41
          i=k-n;
42
          
43
          if (i>=0) // Summe fängt bei i=0 an (keine Negative Werte)!!!!
44
          {  
45
                               
46
           c[k] = c[k] + (a[n]*b[i]);   //Faltung
47
48
           }
49
           
50
           
51
     
52
  
53
           
54
       }
55
   }
56
  
57
  
58
  //Ausgabe der Folge c[k] auf dem Bildschirm
59
             printf("Faltung von an * bn = cn \n\n");
60
             
61
       for(k=0; k<=20; k++)
62
       {
63
            
64
             printf("a[%d] = %d    b[%d]= %d        c[%d] = %d\n",k,a[k],k,b[k],k,c[k]);
65
       }
66
             printf("\n\nBerechnung Ende \n\n");
67
  
68
  system("PAUSE");  
69
  return 0;
70
}

von A. B. (funky)


Lesenswert?

nach 2 Jahren musste das jetzt wirklich mal gesagt werden ;))

von Samir D. (hota)


Lesenswert?

FIR filter  in C implimentieren aber Parallelisieren mit OpenMP ??????

: Bearbeitet durch User
von Ein Gast (Gast)


Lesenswert?

:D

von Michael W. (Gast)


Lesenswert?

Samir D. schrieb:
> FIR filter  in C implimentieren aber Parallelisieren mit OpenMP

Grundsätzlich kann man das durchaus parallelisieren.
Ist hauptsächlich eine Frage der Stratgie der Threaderzeugung.

von Sinus T. (micha_micha)


Lesenswert?

Oh Gott - nach 11.5 Jahren gibt immernoch Jemand seinen Senf dazu :-(

von Und noch einer (Gast)


Lesenswert?

Ich glaube, das liegt daran, dass einem beim Eintippen neuer Fragen 
alte, ähnliche Beiträge vorgeschlagen werden. Ist dann die Frage ob man 
sich da dranhängt. Es hätte den Vorteil, dass jemand auch Antworten 
findet, wenn ihm zuerst der alte Faden ausgegeben wird.

>FIR in C programmieren

Man sollte erst mal festlegen, welcher Filter das sein soll, denn "FIR" 
sagt nicht viel, wie man nachlesen kann.

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.