Error when taking the continuous time Fourier transform

11 views (last 30 days)
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 Comments
Jeffrey Clark
Jeffrey Clark on 11 Jul 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. on 11 Jul 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.

Sign in to comment.

Accepted Answer

Paul
Paul on 11 Jul 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 Comments
L'O.G.
L'O.G. on 11 Jul 2022
Thanks @Paul. This is interesting. I'll think about this. Really appreciate your help.
Paul
Paul on 11 Jul 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')

Sign in to comment.

More Answers (0)

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!