2016-04-05 5 views
0

Ich versuche gerade, einen sehr groben, aber funktionierenden Ringspeicher für die Echtzeit-Signalverarbeitung zu entwerfen. Aus Gründen der Übersichtlichkeit habe ich keine DSP Toolbox-Lizenz.Ringpuffer in Simulink implementiert als MATLAB-Funktion

Jetzt ist die Idee, einen Teil des Signals innerhalb eines 1xN Fensters zu puffern und dann weiter zu verarbeiten. Um dies zu erreichen, habe ich mir einen Simulink-Block wie in der folgenden Abbildung ausgedacht.

enter image description here

Das Problem ist folgendes: wenn die MATLAB-Funktion

ist
function y = fcn(Signal,DelayedBuffer,BufferSize) 
%#codegen 
% y = zeros(1,BufferSize); 
persistent Buffer; 
Buffer = [Signal DelayedBuffer(1:59-1)]; 

y = Buffer; 
end 

alles gut funktioniert. jedoch beim Schreiben der Funktion als

function y = fcn(Signal,DelayedBuffer,BufferSize) 
%#codegen 
% y = zeros(1,BufferSize); 
persistent Buffer; 
Buffer = [Signal DelayedBuffer(1:BufferSize-1)]; 

y = Buffer; 
end 

Ich erhalte die folgenden Fehler:

Data 'y' (#32) is inferred as a variable size matrix, while its specified type is something else.

Haben Sie einen wertvollen Tipp, wie man diese Fehler zu unterdrücken?

Antwort

1

MATLAB-Funktionsblock funktioniert, indem kompilierter Code für den eingegebenen MATLAB-Code generiert wird. Um Code zu generieren, muss der Block die Größe, den Typ und die Komplexität aller von Ihnen verwendeten Eingaben und Variablen kennen. Es leitet die Größe der Variablen und Ausgaben basierend auf der Größe der Eingaben ab. Wenn Sie Buffer erstellen

mit
Buffer = [Signal DelayedBuffer(1:59-1)]; 

es leicht zu sehen ist, dass die Größe des Puffers 59 Elemente (Signal unter der Annahme Skalar). Der MATLAB-Funktionsblock kann diese Größe ableiten und außerdem erkennen, dass y, dem auch der Puffer zugewiesen ist, dieselbe Größe hat. Im zweiten Fall

Puffer = [Signal DelayedBuffer (1: BufferSize-1)];

BufferSize kommt von Eingabe und MATLAB Funktionsblock kennt diesen Wert nicht beim Kompilieren. Es muss also angenommen werden, dass sich dieser Wert ändern kann, was zu Daten variabler Größe führt. Es kann die Größe des Puffers während des Kompilierens nicht bestimmen. 'y', dem der Puffer zugeordnet ist, wird ebenfalls als Daten variabler Größe abgeleitet. Die Fehlermeldung zeigt an, dass Sie die Ausgabegröße in den Blockparametern als feste Größe angegeben haben. Im Dialogfeld "Ports and Data Manager" des Blogs gibt es ein Kontrollkästchen, das angibt, dass der Ausgabeport eine variable Größe hat. Sie können das Kontrollkästchen aktivieren, um zu sehen, ob das funktioniert. Aber in Ihrem Fall ist es für einen Ringpuffer besser, eine persistente Variable zu verwenden, die Ihnen Daten fester Größe liefert.

Wenn Ihre BufferSize nicht innerhalb einer Simulation geändert werden muss, verwenden Sie sie als Parameter für den MATLAB-Funktionsblock anstelle einer Eingabe. Dies können Sie auch über den Dialog "Ports and Data Manager" tun.

+0

Nun, die Größe des Puffers bleibt über die Simulationslänge konstant, aber ich möchte dem Benutzer erlauben, die Größe des Puffers einzustellen, um herauszufinden, welche Größen die besten Ergebnisse erzielen. Ich habe versucht, die 'BufferSize' als Parameter zuzuweisen, aber ich verstehe nicht klar, wie man es an die Funktion weitergibt, da der Port nicht mehr mit der Funktion verbunden ist. – fpe

+0

Sobald Sie einige Eingaben als Parameter eingegeben haben, können Sie sie unter demselben Namen in einem Modellarbeitsbereich oder MATLAB-Basisarbeitsbereich definieren. Sie können einfach BufferSize = 59; in der Befehlszeile. Sie sollten dies nicht tunbar machen, da Sie es nicht innerhalb einer Simulation ändern müssen. Sie können es zwischen Simulationen ändern. – Navan