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

Jan
Jan 2019년 4월 11일
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 2019년 4월 14일
Thank you for your response.
Regards

댓글을 달려면 로그인하십시오.

 채택된 답변

Star Strider
Star Strider 2019년 4월 11일

5 개 추천

... 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

Danish Ahmad
Danish Ahmad 2019년 4월 14일
It worked. Thank you for your response.
Regards
Star Strider
Star Strider 2019년 4월 14일
As always, my pleasure.
Naveen P
Naveen P 2019년 11월 28일
Simple, but effective reply. Solved my problem too.
Thansk for the question too
Star Strider
Star Strider 2019년 11월 28일
@Naveen P — A vote would be appreciated!
Jan
Jan 2019년 11월 29일
You got my vote at least. :-)
Star Strider
Star Strider 2019년 11월 29일
@Jan — Thank you!
Rifat Afroz
Rifat Afroz 2020년 2월 26일
@ 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 2020년 2월 26일
@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 2020년 2월 27일
Thanks for the tips. Still working on it.
Star Strider
Star Strider 2020년 2월 27일
My pleasure.
Diego Soto Chávez
Diego Soto Chávez 2020년 9월 2일
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)
.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Resizing and Reshaping Matrices에 대해 자세히 알아보기

태그

질문:

2019년 4월 11일

댓글:

2020년 9월 2일

Community Treasure Hunt

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

Start Hunting!

Translated by