Verfasst am: 05.06.2012, 08:52
Titel: Über die Simulationszeit variabler Bandpassfilter gesucht.
Hallo!
Ich würde gerne ein Weißes Rauschen zu einem Schmalbandrauschen umwandeln. Dies habe ich bereits mit dem Bandpassfilter aus dem Signal Processing Blockset geschafft. Leider kann ich bei diesen Filtern die Durchlassfrequenzen nicht während des Versuches verändern. Ziel ist es nämlich ein adaptives System zu erstellen, das Schmalbandrauschen erzeugt, welches einer bestimmten Funktion folgt. Auch wenn ich die Grenzen des Filters als Workspacevariable angebe, dann wird diese ja nur einmal am Simulationsanfang eingelesen und ist damit auch keine variable. Hat jemand Ideen? Funktioniert es vielleicht, den adaptiven Filter LMS zu benutzen?
Vielen Dank,
MFG,
Sounder
Ich weiß, dass man mit sogenannten Level1 od. 2 s-Functions in matlab auch während der Simulation Parameter ändern kann. Aber ich kenne mich damit nicht aus.
Bei dem adaptiven Filter müsstest du ja ein Sollsignal vorgeben, nach dessen Vorgabe das Filter dann versucht, dass Istsignal daran anzupassen. Kannst du mal ein genaueres Bsp. geben (für die bestimmte Fkt.).
Was ich genau vorhabe ist folgendes:
Ich möchte aus einem Geräusch, bspweise ein Bohrmaschinengeräusch analysieren und mittels fft herausfinden, in welcher Frequenz die Hauptschallanteile liegen. Diese Frequenz würde ich dann gerne meinem Variablen Filter geben, damit dieser mir ein Schmalbandrauschen erzeugt, dessen mittenfrequenz genau mit der Hauptfrequenz des Bohrmaschinengeräuschs übereinstimmt. Die Breite des Rauschens soll dann erstmal fest eingestellt bei vll 200 hz liegen. Also z.B. Bohrmaschinengeräusch mit Hauptfreuenz 600Hz. Dann möchte ich ein Schmalbandrauschen mit 500-700hz bekommen.
Ich überlege gerade, mein Rauschen fouriermäßig zu transformieren und dieses signal mit einer variablen Kurve zu multiplizieren. Am Ende dann wieder Invers transformieren. Bedeutet aber wahrscheinlich einiges an rechenaufwand, was schlecht für meine echtzeitsimu wäre, oder?
Das heißt ja aber zunächst einmal, dass du dein gesuchtes Signal/Freq. in dem Betragsspektrum deines aufgenommenen Signal findest. Je nach dem wie stark die Hauptfreq. gegenüber den anderen ist und wie viele relevante Freq. auftreten kann das hier schon ein durchaus schwieriger Punkt werden. Was auf einem Plot ersichtlich ist, ist mit einem Algorithmus nicht immer eindeutig findbar. Hier fällt es dann oft schwer eindeutige Kriterien als Suche aufstellen zu können. Das hängt halt wie gesagt von dem Geräusch ab.
Nehmen wir mal an, dass es möglich ist. Du könntest doch die Begrenzung (Bandpassfilterung) auch im Spektrum selber vornehmen, in dem die unerwünschten Freq.anteil Null setzt (außer Gleichsignalanteil) und dann das Signal rücktransformierst. Hier ist dann aber Bedingung, dass genügend Freq. anteile noch in deinem Bandpasssignal enthalten sind, sonst tritt das Gibbs-phänomen auf und dein Signal wird an den Rändern (im Zeitbereich) verfälscht sein. Es wären auf jeden Fall ein Versuch wert.
Ja, das ist ein guter Punkt. Das kann in der Tat schwierig werden, Danke!
Leider bin ich noch nicht so gewieft im Umgang mit Simulink, aber die Transformation und Rücktransformation war auch mein Gedanke. Es fehlt mir eben noch Erfahrung mit der Umsetzung. Ich würde das FFT-signal mit einem Rechteckfenster multizieren (so gedanklich) und bekäme dann durch die IFFT ein Schmalbandrauschen, oder?
Hier hab ich quasi meine Idee her.
[http://www.medialab.ch/archiv/pdf_studien_diplomarbeiten/1sa03/1sa2003-139_EchtzeitAudioEqualizerMitSimulink%20(Balczarczyk&Guldener).pdf]
Ich weiß leider nicht, welchen Block ich nehme, um diese Rechteckfunktion zu erzeugen - und sie gleichzeitig variabel zu lassen.
Die Umsetzung in Simulink, das Filtern sowie das Finden des gewünschtes Bereiches sind ja verschiedene paar Schuhe, die man nicht unbedingt alle auf einmal lösen muss. Das Filtern wäre zunächst ein Schritt zum Testen, der vollkommen unabhängig gelöst werden kann.
Speicher dir dein Signal in Simulink ins Workspace und mach den "Rest" in einem m-file in matlab. Das ist zunächst mal einfacher, da es hierfür unzählige fast fertige Code-Bsp. im Forum gibt. Entweder es geht oder du musst einen neuen Ansatz für die Filterung finden. Die Umsetzung in Simulink würde ich zum Schluss machen.
Ich habe dir hier mal ein kleines Skript geschrieben, wo du die Filterung mittels FFT und Löschen testen kannst. Zum Vergleich wird noch ein IIR Butterworth verwendet. Im Zeitbereich sind die beiden gefilterten Signale nicht ganz gleich. Das kommt vor allem durch den Einschwingvorgang des Butterworth, wodruch ja ein Delay vorhanden ist. Man müsste dieses Signal also nun um den Delay verschieben, um die beiden Signale im Zeitbereich besser vergleichen zu können. Zu dem dämpft das Filter ja auch nicht exakt alle Frequenzen außerhalb des Passbandes vollkommen weg. Vom Prinzip her passt das aber schon.
Das Löschen der nicht benötigten Signalfreq. geht sicherlich auch noch etwas geschickter...aber so gings für mich jetzt erstmal am schnellsten.
plot(f, 20*log(amplitudengang), 'b*-')
%axis([-fn fn 0 a/2*1.1]) title('Amplitudengang') ylabel('Amplitude in dB') xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in Hz']) grid
% Bandpassfilterung Test: 500 - 1000 Hz % 1. Filterung über Löschen von Freq.anteilen aus H % Index der Freq. in f für H ermitteln
indx_low = find(f<500,1,'last');
indx_high = find(f<=1000,1,'last');
% H umwandeln: -fn...0...+fn-df
mtlb_del = fftshift(H);
% Löschen außerhalb des Bereichs 500...1000 Hz % Gleichsignalanteil bei Index N/2 + 1 % für positiven Freq.bereich
indx = (N/2)+1 + indx_low;
mtlb_del((N/2)+1:indx ) = 0;
indx = (N/2)+1 + indx_high;
mtlb_del( indx:end) = 0;
% für negativen Freq.bereich % index 1 in H = -fn % index N/2 in H = -df
indx = (N/2)+1 - indx_low;
mtlb_del( indx:(N/2)) = 0;
indx = (N/2)+1 - indx_high;
mtlb_del(2:indx) = 0;
% wieder zurück wandeln für Darstellung
mtlb_del = fftshift(mtlb_del);
% Rücktransformation in Zeitbereich
mtlb_del_filt = ifft(mtlb_del,N);
% Test mit Matlab Filter: % 2. Filterdesign mit matlab
d = fdesign.bandpass('n,fc1,fc2', 30, 500, 1000, Fs);
hd = butter(d);
mtlb_filt = filter(hd,mtlb);
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.