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

ÜF im Frequenzbereich und Signal im Zeitbereich

 

Gaga
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 07.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.03.2017, 13:36     Titel: ÜF im Frequenzbereich und Signal im Zeitbereich
  Antworten mit Zitat      
Hallo allerseits,

ich habe ein Eingangssignal x(t) im Zeitbereich und eine Funktion des Amplitudenganges H(f) im Frequenzbereich. Das zu ermittelnde Ausgangssignal y(t) ist eben um diese Amplitude verstärkt bzw. gedämpft. Am Ende will ich das Ausgangssignal im Zeitbereich darstellen. Dazu habe ich meiner Meinung nach 2 Optionen.

1. Konvertieren von x(t) in den Frequenzbereich, Multiplikation mit H(f) und anschließend wieder Rcktranformation mittels ifft in den Zeitbereich.

2. Transformation von H(f) in den Zeitbereich (Impulsantwort) und Faltung mit x(t).
y = x*h

Die 2. Option erscheint mir auf den ersten Blick der bessere weil einfachere Weg, da ich mir eine Transformation spare. Nichtsdestotrotz stehe ich auf dem oft zitierten Schlauch.
Um dem ganzen Vorhaben beizukommen habe ich mir zu Option 2 ein kleines Beispiel kreiert.

Code:

Fs = 2048;          % Sampling frequency
N = Fs;             % Number of samples

t = (0:(N-1))*1/Fs; % Time array
f1 = 20;            % Frequency

x = 1.5 * sin(2*pi*1/lambda*1000*t);    % Input signal

df = Fs/N;          % Frequency resolution

f = -Fs/2:df:Fs/2-df;   % Mirrored frequency array

% Symmetric transfer function with a Ppak at 20Hz
H_TransferFunction = zeros(1,2048);
H_TransferFunction(1,1045) = 0.5;
H_TransferFunction(1,1005) = 0.5;

figure;
plot(f,H_TransferFunction)
xlabel('Frequency [Hz]');
ylabel('Transfer Function');

% Convert to time domain
h_TimeDomain = ifft(ifftshift(H_TransferFunction))*Fs/2;
 


h_TimeDomain sieht eigentlich so aus wie ich es mir erwartet habe. Eine Schwingung mit der Amplitude von 0,5. Die Erweiterung mit Fs/2 ist rein aus der 'Trial and Error' Methode entstanden, wird aber vom 1/N der ifft herrühren (?). Allerdings befinde ich mich nun in einer Sackgasse, denn ich wüsste nicht wie ich nun die Faltung durchführen sollte. Am Ende sollte sich eine Schwingung mit 0,75 Amplitude ergeben. Eventuell ist doch die 1. Option anzuwenden.

Vielleicht kann mir jemand sagen ob meine Herangehensweise überhaupt Sinn macht. Viele Stunden würden mir erspart bleiben.

Liebe Grüße,
Gaga
Private Nachricht senden Benutzer-Profile anzeigen


Gaga
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 07.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2017, 18:58     Titel:
  Antworten mit Zitat      
Im Code im ersten Post muss anstatt 1/lambda --> f1 stehen. Ich weiß leider nicht wie ich den Beitrag editieren kann.

Weiters hab ich nun das Ganze mit der Variante 1 probiert, was auch halbwegs funktioniert, aber an der Rücktransformation hapert es noch. Hier mal der Code:

Code:

Fs = 2048;              % Sampling frequency
N = 1*Fs;               % Number of samples

x = (0:(N-1))*1/Fs;     % x array
len = length(x);        % Length x-Vector  

% Create signal
z =  sin(2*pi*1/0.08*x) +  0.7*sin(2*pi*1/0.05*x);
%z = z + 0.1*randn(size(t));     % Sinusoids plus noise

%% FFT
NFFT = 2^nextpow2(len);          % Next power of 2 from length of x
Z = fft(z,NFFT)/len;
Z_Amplitude = 2*abs(Z(1:NFFT/2+1));
f = Fs/2*linspace(0,1,NFFT/2+1);

%% Transfer function
L = 36;                 % Chord length [mm]
alpha = 12/L;         % Sensor distance ratio

lambdaArray = 1./f*1000;
k = 2*pi./lambdaArray;
H_TransferFunction = ((cos(alpha*k*L)-alpha*cos(k*L)-(1-alpha)).^2 + (sin(alpha*k*L)-alpha*sin(k*L)).^2).^(1/2);

% Inverse transfer function matrix
H_TransferFunctionInverse = 1./H_TransferFunction;

%% Multiply transfer function with Z_Amplitude
% Only valid in desired wavelength (frequency), everywhere else = 0
H_TransferFunctionInverse(f<1/0.1 | f > 1/0.03) = 0;

Y = Z_Amplitude.*H_TransferFunctionInverse;

%% Transform to time domain
y_TimeDomain = ifft(Y,'symmetric')*Fs/2;

%% Plot
% Plot FFT
figure;
subplot(2,1,1)
plot(x,z)
xlabel('x [mm]')
ylabel('z(x) [mm]')
title('Inputsignal')

subplot(2,1,2)
plot(f,Z_Amplitude)
xlim([10, 100])
title('Single-Sided Amplitude Spectrum of z(x)')
xlabel('f [Hz]')
ylabel('|Z(f)| [mm]')

% Plot multiplication in frequency domain
figure
subplot(3,1,1)
plot(f,Z_Amplitude)
xlim([1/0.1,1/0.03])
title('Single-Sided Amplitude Spectrum of z(x)')
xlabel('f [Hz]')
ylabel('|Z(f)| [mm]')

subplot(3,1,2)
plot(f,H_TransferFunctionInverse)
xlim([1/0.1,1/0.03])
xlabel('f [Hz]')
ylabel('H''(f)')
title('Inverse TF')

subplot(3,1,3)
plot(f,Y)
xlim([1/0.1,1/0.03])
title('Single-Sided Amplitude Spectrum of y(x)')
xlabel('f [Hz]')
ylabel('|Y(f)| [mm]')

% Plot IFFT
figure
subplot(2,1,1)
plot(f,Y)
xlim([10, 100])
title('Single-Sided Amplitude Spectrum of y(x)')
xlabel('f [Hz]')
ylabel('|Y(f)| [mm]')

subplot(2,1,2)
plot(x(1:NFFT/2+1),y_TimeDomain)
title('Outputsignal')
xlabel('x [mm]')
ylabel('y(x) [mm]')
 


Genau genommen handelt es sich dabei eben um die Ortsfrequenz f=1/lambda. Die ÜF braucht euch nicht weiter zu interessieren, die kann man einfach mal so stehen lassen.
Wenn ich mit meinen Eingangsfrequenzen die 'frequency bins' treffe, dann erhalte ich nach der FFT wunderschöne Peaks und auch die IFFT funktioniert wunderbar.
z.B. für:
Code:

z =  sin(2*pi*20*x) ;
 


Bei einem stochastischen Signal sieht das aber etwas anders aus.
Gibt es diesbezüglich eine Möglichkeit das Verhalten und die Genauigkeit zu verbessern? Oder müsste man die Amplituden nach der FFT so bearbeiten, dass nur mehr diskrete Peaks auftreten?

Vielen Dank schon mal.

Oh siehe da, die Antwort kann ich editieren Wink
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.