Ich beschäftige mich privat gerade mit der Weighted Overlap-Add oder auch Overlap-Add mit überlappender Segmentierung (vgl. Kammeyer, Digitale Signalverarbeitung).
Bevor ich den Algorithmus jedoch auf einem DSP laufen lasse, wollte ich mir die Vorgehensweise in einem MATLAB-Script noch einmal veranschaulichen.
Die Ergebnisse einer "normalen Filterung" also: komplettes gefenstertes Signal + Impulsantwort mit der DFT in den Frequensbereich transformiert dort multipliziert und mit der inversen DFT wieder zurück oder direkt über ein Faltung im Zeitbereich berechnet - Sind dem meiner Weighted Overlap-Add zwar ähnlich aber "mehr" auch nicht.
Falls jemand Erfahrung mit der WOLA hat wäre es nett einen Blick auf mein WOLA TEST-Script zu werfen...
ich habe dir jetzt mal das Overlap-Add Verfahren erstellt. Allerdings komme ich mit der zusätzlichen Fensterung auch noch nicht auf das richtige Ergebnis. In dem angegeben Buch (ich habe die 4. Auflage) ist das Verfahren nur ohne eine Fensterung erklärt. Dafür liefert der Code das richtige Ergebnis.
Ich bin ebenfalls der Meinung, dass man nicht jeden Block fenstern darf, sondern zunächst das komplette Signal x fenstert und erst dann die Faltung in den Blocken erfolgt. Hier gibt es dann aber dennoch eine Abweichung. Ich werde da mal noch weiter forschen...
% Ordnung FIR-Filter
m=32; %L/2 % Impulsantwort h mit der Länge m+1 % sinus mit fsignal*4 soll gefiiltert werden
h=fir1(m, (fsignal*2)/Fn); % FIR Tiefpass
% ---------- START WOLA ---------- % Blocklaenge
L = 64;
R = N/L; % Anzahl Bloecke % Frequenzantwort des Filters
H = fft(h, L + m); % Blocklaenge + N
% Grenzen für Index des aktuellen Blocks
low = 1;
high = L;
% Hann-Fenster
wHann=rectwin(L); % zu Testzwecken ein Rechteckfenster
% ---------- WOLA ---------- for i=1:R
% Fensterung des Blocks
x_win = x(low:high) .* wHann';
% FFT der Bloecke
X_win = fft(x_win, L + m); % Nullen werden angefügt auf die Länge L + M % Faltung von H und X_win
Y = X_win .* H;
% Rücktransformation in Zeitbereich
y_R(:,i) = ifft(Y, L + m);
% Ergebniskorrektur mittels Overlapp-Add % Überlappung von m Werten der benachbarten Bloecke addieren if i > 1 % neuen Block anhängen
y_wola(low:high+m) = y_R(:,i);
% Überlappung addieren
y_wola(L*(i-1) + 1:L*(i-1) + m) = y_R(L+1:L+m,i-1) + y_R(1:m,1);
else
y_wola(1:L+m) = y_R(:,i); % nur für ersten Block end;
% nächsten Block holen
low = high + 1;
high = high + L;
end
% ---------- END WOLA ----------
% ---------- Vergleich mit Filterung als Gesamtsignal ---------- % Hann-Fenster
wHann=rectwin(N)';% zu Testzwecken ein Rechteckfenster
% zyklische Faltung des kompletten Signals
X = fft(x.*wHann,N+m);
H2 = fft(h,N+m);
Y2 = X.*H2;
y2=ifft(Y2);
hab mir den Code gerade mal angeschaut. Ich bin noch relativ neu hier und hab mit Matlab relativ bescheidene Erfahrungen. Mich verwirrt das klein m oben bei Filter-Ordnung. Bei fir1 wird es als Ordnung verwendet und unten sieht es so aus als wäre es die Überlappung der Blöcke oder?
Naja, ich hatte dass so verstanden das m die Filter-Ordnung ist und eine Überlappung bei Overlap-Add zwei unterschiedliche Variablen sein müssten weil es unterschiedliche Paramater sind oder?
_________________
MfG
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.