Error when taking the continuous time Fourier transform

14 visualizzazioni (ultimi 30 giorni)
I am trying to figure out what the error is associated with taking a Fourier transform. I have a 1D vector A of 130 elements and I know the error associated with each element that is just a number. The error is a 130 element vector called std_A. From that I think I can calculate the error associated with the function that it makes up:
syms t w real
f(t) = sum(exp(-t./A))*heaviside(t);
std_ft(t) = sqrt(sum((abs(t).*exp(-t.*A)*heaviside(t)+dirac(t)).*std_A).^2);
The last line is what I calculated by doing the error propagation for the nonlinear function and is approximate.
Since I think in general you need to take the Fourier transform of the error in the time domain to calculate the error in the frequency domain, I have:
std_fw(w) = fourier(std_ft(t),t,w);
The calculation is very slow I think due to the length of the vector A and also the end result is actually a function of both t and w, which I'm not sure how to work with.
Is there a better way of doing this? I feel like I am making this harder than it needs to be.
  4 Commenti
Jeffrey Clark
Jeffrey Clark il 11 Lug 2022
@L'O.G., thanks for explaining some things. Your original post said std_fw(w) returned something that is a function of both t and w, but in your simplified example above f(w) is only a function of w. Is this your question? (It is mine.) Could the symbolic math engine not have been able to do the fourier completely? Or is your f(t) above and std_ft(t) quite different if you were to ask MATLAB to display those symbolic equations like you did above for f(w), perhaps with unresolved dependencies?
L'O.G.
L'O.G. il 11 Lug 2022
@Jeffrey Clark I thought f(w) should only be a function of w, but unfortunately the symbolic engine doesn't seem able to do the CTFT completely. See Paul's response below and my comment to him, which is really the crux of my problem.

Accedi per commentare.

Risposta accettata

Paul
Paul il 11 Lug 2022
Using some examle data ...
A = 1:5;
std_A = 11:15;
syms t w real
f(t) = sum(exp(-t./A))*heaviside(t)
f(t) = 
std_ft(t) = sqrt(sum((abs(t).*exp(-t.*A)*heaviside(t)+dirac(t)).*std_A).^2)
std_ft(t) = 
FWIW, there is no need to use abs(t) here because each is multiplied by heaviside(t).
Anyway, I doubt the signal std_ft(t) has a closed form expression for its Fourier Transform, assuming its Fourier Transform exists.
fourier(std_ft(t),t,w)
ans = 
Certainly Matlab can't find one, so it just resturns an answer in terms of fourier().
  6 Commenti
L'O.G.
L'O.G. il 11 Lug 2022
Thanks @Paul. This is interesting. I'll think about this. Really appreciate your help.
Paul
Paul il 11 Lug 2022
Actually, I guess I should have at least run a simple test to see if it works:
syms t w real
A = 1; dtau = 0.1;
f(t) = exp(-t/(A + dtau))*heaviside(t);
F(w) = fourier(f(t),t,w);
f0(t) = exp(-t/A)*heaviside(t);
F0(w) = fourier(f0(t),t,w);
dF(w) = dtau/A^2/(1/A + 1i*w)^2;
figure;
fplot(abs([F(w) , F0(w) , dF(w) , F0(w)+dF(w)]))
legend('F', 'F0', 'dF' , 'F0 + dF')
figure;
fplot(angle([F(w) , F0(w) , dF(w) , F0(w)+dF(w)]))
legend('F', 'F0', 'dF' , 'F0 + dF')

Accedi per commentare.

Più risposte (0)

Prodotti


Release

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by