WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Über die Simulationszeit variabler Bandpassfilter gesucht.

 

sounder
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2012, 08:52     Titel: Über die Simulationszeit variabler Bandpassfilter gesucht.
  Antworten mit Zitat      
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 Very Happy
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.06.2012, 09:29     Titel:
  Antworten mit Zitat      
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.).
Private Nachricht senden Benutzer-Profile anzeigen
 
sounder
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2012, 09:42     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.06.2012, 13:02     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
sounder
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.06.2012, 13:28     Titel:
  Antworten mit Zitat      
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.

Aber schonmal vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.06.2012, 14:41     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.06.2012, 21:27     Titel:
  Antworten mit Zitat      
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.

Code:

load mtlb;

N = length(mtlb);
N = 2^nextpow2(N); % nächste 2er Potenz für FFT
Fn = 0.5*Fs;
df = Fs/N; % Frequenzauflösung

% Frequenzvektor
f = 0:df:Fn; % Darstellung bis zur Nyquistfreq.


H = fft(mtlb,N);          % Tranformation

% Skalierung
amplH = abs(H);
amplitudengang = [amplH(1)/N; amplH(2:N/2)/(N/2); amplH((N/2)+1)/N];

figure(1)

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);

% Skalierung
amplH = abs(mtlb_del(1:(N/2)+1));
amplitudengang = [amplH(1)/N; amplH(2:N/2)/(N/2); amplH((N/2)+1)/N];
hold on;
plot(f, 20*log(amplitudengang), 'g.-')

% 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);

% Darstellung im Freq.-bereich

H = fft(mtlb_filt,N);          % Tranformation

% Skalierung
amplH = abs(H);
amplitudengang = [amplH(1)/N; amplH(2:N/2)/(N/2); amplH((N/2)+1)/N];
hold on;
plot(f, 20*log(amplitudengang), 'r')
legend('original Signal', 'Filterung über Löschen', 'Filterung über Butterworth')
%axis([-fn fn 0 a/2*1.1])

% Zeitbereich
figure(2)
plot(mtlb,'b');
hold on;
plot(mtlb_filt,'r.-');
plot(mtlb_del_filt,'g--');
title('Darstellung im Zeitbereich')
ylabel('Amplitude')
xlabel(['Messwert N'])
legend('original Signal', 'Filterung über Löschen', 'Filterung über Butterworth')
grid on;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.