After using "FFT" getting NAN. Why?

clc
close all
clear all
%%
data = xlsread('freq15.xlsx','Group Name #2');
v= data(:,1);
plot (v);
title('Voltage signal with noise')
xlabel('Samples')
ylabel('Amplitudes')
%%
%plot magnitude specturm of a signal
clc
format long
X_mag=abs((fft(v)))
figure(1)
plot(X_mag)
xlabel('DFT Bins')
ylabel('Magnitude')
%%
Above is a code using FFT in MATLAB. The outcome of the code is NAN+NANi. How to get rid of NAN or what is the reason of this outcome?

2 comentarios

Jan
Jan el 11 de Abr. de 2019
Please use the buttons to format the code. It is a good idea to post a question in the best readable format.
Omit the brute clearing header "clc; close all; clear all". This is a waste of time and cargo-cult-programming. If you want to keep your workspace clean, use functions.
Without knowing, what the contents of v is, there is no chance to understand, why abs((fft(v))) is NaN. So please show us, what your input data are.
Danish Ahmad
Danish Ahmad el 14 de Abr. de 2019
Thank you for your response.
Regards

Iniciar sesión para comentar.

 Respuesta aceptada

Star Strider
Star Strider el 11 de Abr. de 2019

5 votos

... what is the reason of this outcome?
You probably either have a NaN in your data, or an empty cell. Both will appear as NaN in the xlsread output.
If that is the situation, your best option is to interpolate using the fillmissing (link) function (R2016b and later releases). The reason is that Fourier transforms require regularly-sampled time-domain signals for them to provide reliable output. Omitting the NaN value disrupts this regularity and results in an inaccurate fft result. Interpolating the NaN values will not provide as accurate a result has having the original value, however it is the only reliable alternative.

12 comentarios

Danish Ahmad
Danish Ahmad el 14 de Abr. de 2019
It worked. Thank you for your response.
Regards
Star Strider
Star Strider el 14 de Abr. de 2019
As always, my pleasure.
Naveen P
Naveen P el 28 de Nov. de 2019
Simple, but effective reply. Solved my problem too.
Thansk for the question too
Star Strider
Star Strider el 28 de Nov. de 2019
@Naveen P — A vote would be appreciated!
Jan
Jan el 29 de Nov. de 2019
You got my vote at least. :-)
Star Strider
Star Strider el 29 de Nov. de 2019
@Jan — Thank you!
Rifat Afroz
Rifat Afroz el 26 de Feb. de 2020
@ Star Strider: is there any proper way to know how the NaNs should be filled depending on the nature of the dataset? I have a large frequency domain 2D matrix (403 x 11274) in which around half the data are NaNs and I need to ifft it. According to your explanation, I can't omit the NaNs to make the ifft operation go right. I tried interpolating the NaNs with fillmissing function and with the inpaint_nans inpaint_nans. But the ifft operation still seems incorrect. I was wondering if there is way to know how should the data look like to replace the NaNs in frequency domain.
Thank you.
Star Strider
Star Strider el 26 de Feb. de 2020
@Rifat Afroz — The problem with doing an ifft is that it is necessary to have the complete fft with all the positive and negative frequencies. (The ’negative’ frequencies only appear as such after using the fftshift function. The ifft must be done on the unshifted fft result.) The values in the positive and negative frequencies must appear in complex-conjugate pairs.
If you do not replace the NaN values with fillmissing, the entire ifft result will be NaN.
I had never considered the posssibility of using fillmissing to replace the NaN values in a complex vector such as an fft result. I did an experiment with that just now and found that fillmissing works very well (almost perfectly) and that with a relatively simple waveform, the fillmissing results were close to the original, including the sign of the imaginary part, so the ifft of the NaN-altered-and-filled fft was essentially the same as for the ifft of the original fft. (The NaN-altered fft was about 10% NaN values, so not trivial.)
In my ‘experiment’, I used the 'linear' method for the fillmissing interpolation. See if other methods — particularly 'spline' or 'pchip' — improve your results.
Rifat Afroz
Rifat Afroz el 27 de Feb. de 2020
Thanks for the tips. Still working on it.
Star Strider
Star Strider el 27 de Feb. de 2020
My pleasure.
Diego Soto Chávez
Diego Soto Chávez el 2 de Sept. de 2020
Hi Star Strider
know you another option like "fillmissing" but for previosly versiones of matlab? Thanks!!
Something like this woulld likely work:
t = 1:8
y = rand(size(t))
y([3 5]) = NaN
ti = t;
ti(isnan(y)) = []
y(isnan(y)) = []
ynew = interp1(ti, y, t)
.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Etiquetas

Preguntada:

el 11 de Abr. de 2019

Comentada:

el 2 de Sept. de 2020

Community Treasure Hunt

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

Start Hunting!

Translated by