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?
Was das steht hast du begriffen ? Wo ist die Schwierigkeit ? Bei der Mathe oder beim C ?
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.
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.
Kann es sein das mit dem Stern die Faltung gemeint ist und nicht Multiplikation?
Schau mal hier Hier kannst du dir eine Software downloaden die dir direkt C - Code generiert http://www.winfilter.20m.com/ Gruss Helmi
Hat niemand von euch schonmal so einen FIR Filter in C programmiert? Der Stern bedeutet hier eine Multiplikation.
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 | }
|
@ ----: 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.
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.
@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
@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.
@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:
@Thomas Danke für die Aufklärung, dass der Operator "*" oben nicht für eine Multiplikation steht, sondern für eine Faltung.
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?
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.
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
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.
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 | }
|
FIR filter in C implimentieren aber Parallelisieren mit OpenMP ??????
:
Bearbeitet durch User
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.