1d linear convolution in ANSI-C-code?
Anstatt das Rad neu zu erfinden, ich Frage mich, wenn jemand könnte sich mich auf eine 1D linear convolution code-snippet in ANSI C? Ich habe eine Suche auf google und in-stack-overflow, aber konnte nicht finden, dass irgendetwas in C, die ich verwenden könnte.
Beispielsweise für Arrays A, B und C, alle mit doppelter Genauigkeit, wobei A und B sind die Eingänge und C ausgegeben wird, mit Längen len_A
, len_B
, und len_C = len_A + len_B - 1
bzw.
Mein array so klein sind und so jeder Erhöhung der Geschwindigkeit bei der Umsetzung der schnellen Faltung durch FFT ist nicht notwendig. Suchen für einfache Berechnungen.
Auf welcher Plattform sind Sie targeting? Es ist durchaus möglich, dass eine solche Funktion existiert bereits und Sie können es benutzen.
Ich bin mit gcc4.4.4 und centos 5.7 auf linux 64 bit-server.
Nach viel suchen, fand ich den folgenden code für LinearConvolution(), die in meiner Implementierung funktioniert es schnell und produziert die gleichen Ergebnisse wie Matlab, obwohl der code nicht ganz so einfach zu Lesen und zu verstehen, wie Alex ' s unten. Nicht sicher, ob es irgendwelche Unterschiede gibt ansonsten. Anfangs dachte ich, das war C++ - code, aber es scheint zu laufen gut, wenn kompiliert mit -ansi-Schalter in meinem C-Programm. Ich habe verbunden es hier im Fall ist es nützlich, um andere. dsprelated.com/showmessage/71405/1.php
Ich bin mit gcc4.4.4 und centos 5.7 auf linux 64 bit-server.
Nach viel suchen, fand ich den folgenden code für LinearConvolution(), die in meiner Implementierung funktioniert es schnell und produziert die gleichen Ergebnisse wie Matlab, obwohl der code nicht ganz so einfach zu Lesen und zu verstehen, wie Alex ' s unten. Nicht sicher, ob es irgendwelche Unterschiede gibt ansonsten. Anfangs dachte ich, das war C++ - code, aber es scheint zu laufen gut, wenn kompiliert mit -ansi-Schalter in meinem C-Programm. Ich habe verbunden es hier im Fall ist es nützlich, um andere. dsprelated.com/showmessage/71405/1.php
InformationsquelleAutor ggkmath | 2011-12-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, wie:
Ausgabe:
Längen und Hinweise scheinbar muss nicht 0 sein. Auch
SignalLen + KernelLen - 1
<=(size_t)-1
. Floating-point-Werte gelten als gut. Nichts ungewöhnliches.InformationsquelleAutor Alexey Frunze
Nicht getestet, aber es scheint, wie es funktionieren würde...
Tipp: Wenn es dauert weniger Zeit, um ein Rad neu erfinden, als eine zu finden, halten die ehemalige.
Ich gehe davon aus, die Ergebnisse sind zunächst null. Und ja, die Bedingungen sind nur zu verhindern, dass out-of-bound-Indizes.
Ich glaube nicht, dass der max () - Funktion von ansi-C-kompatibel, so dass ich gerade eine Funktion zu tun, statt. Mit einem kleinen test-array funktionierte es gut. Wenn ich meinen real-arrays (Größe etwa 20K Elemente), es irgendwie enthalten ein ghost-image von einem der Eingabe-arrays in der Ausgabe. Entweder habe ich einen Fehler gemacht bei der Umsetzung der obigen Funktion, oder die Datensätze zwischen diesem test und den ersten test unterscheidet sich von dem Algorithmus s point of view (nicht sicher).
Ich kann wirklich nichts sagen, ohne zu sehen, Ihr Beispiel.
Sie nicht null
r[n]
bevor die innere Schleife wird zu erhöhen, IOW,conv()
erwartetr[]
initialisiert alle0.0
's. Das war vielleicht das problem.InformationsquelleAutor Mehrdad
Da, wir sind unter Faltung von 2 finite-Länge-Sequenzen, damit der gewünschte Frequenzgang erzielt wird, wenn die kreisförmige Faltung durchgeführt wird anstatt einer linearen Faltung. Eine sehr einfache Umsetzung der zirkulären Faltung wird das gleiche Ergebnis zu erzielen als der Algorithmus, gegeben durch Alex.
InformationsquelleAutor Siddhant Raman
Ich verwendet @Mehrdad Ansatz, und erstellt die folgende Antwort:
Gibt es problem mit index-überschreitung der unteren Grenze, wenn in der zweiten loops
k
größer wird alsn
, also denke mal es sollten zusätzliche Bedingung zu verhindern.InformationsquelleAutor Imro Stocky