wny fft does't work with different signal?

2 ビュー (過去 30 日間)
nirwana
nirwana 2023 年 8 月 22 日
回答済み: Star Strider 2023 年 8 月 22 日
I am using fft to extract freq content in my two type of time series. First, time series (file sig_fft.txt) look good and showing some speaktral peak. but unfortunately for second time series (event.txt) no single spectral appear. I even using IFFT as checking wheater fft result can get back the original signal. For me seems FFT is work well. But I still wonder why my FFT having strange result on second one. Can anyone explain why ? Or do I make something wrong in my coding?
Second thing, I wonder about the amplitude on freq domain, does it shoul be the same in the time domain? I read several literature taht it relates to power which is square of amplitude, but why some coding that i found abot fft using 2*abs(fft_result)?
please help this beginner to get more about fft
here modification the code and time series that I use
%PERFORM FFT of data TO GET FREQ CONTENT
data=load("event.txt");
n=length(data(:,1));
srate=1000; %sampling rate
nyq=srate/2;
dataX=fft(data(:,2))/n;
hz=linspace(0,nyq,floor(n/2)+1);
figure (1)
subplot(211)
plot(data(:,1),data(:,2))
xlabel('Time(sec)'), ylabel('Amplitude')
subplot(212)
plot(hz,2*abs(dataX(1:length(hz))),'-r'), xlabel('Freq(Hz)')
%set(gca,'XLim',[0 2],'YLim',[0 100])
%Perform IFFT TO CONSTRUCT ORIGINAL SIGNAL
recon_data=ifft(dataX)*n;
figure(2)
subplot(211)
plot(data(:,1),data(:,2)), xlabel('Time(sec)')
legend('original data')
title('inverse fourier transform')
subplot(212)
plot(data(:,1),real(recon_data),'-r')
legend('reconstruction data')

採用された回答

Star Strider
Star Strider 2023 年 8 月 22 日
Thbere is a farily significant D-C or constant offset in ‘data(:,2)’ and that hides all the spectral peaks of lower magnitudes.
The eassiest way to avoid this is to subtract the D-C offset value (that is actually the mean value of the signal) before calculating the fft:
dataX=fft(data(:,2)-mean(data(:,2)))/n;
that I did here. The spectral peak at about 225 Hz becomes visible. There is nothing wrong with your code (that I can see).
Second thing, I wonder about the amplitude on freq domain, does it shoul be the same in the time domain?
It will be close, however the energy in the signal is distributed over a wide spectrum, so it will rarely be exactly the same. There is also the problem that the fft may not calculate a frequency at exactly the frequency of a particular signal component, so that energy may be spread over a short range of adjacent frequuencies.
Try this —
%PERFORM FFT of data TO GET FREQ CONTENT
data=load("event.txt");
n=length(data(:,1));
srate=1000; %sampling rate
nyq=srate/2;
dataX=fft(data(:,2)-mean(data(:,2)))/n;
hz=linspace(0,nyq,floor(n/2)+1);
figure (1)
subplot(211)
plot(data(:,1),data(:,2))
xlabel('Time(sec)'), ylabel('Amplitude')
subplot(212)
plot(hz,2*abs(dataX(1:length(hz))),'-r'), xlabel('Freq(Hz)')
%set(gca,'XLim',[0 2],'YLim',[0 100])
%Perform IFFT TO CONSTRUCT ORIGINAL SIGNAL
recon_data=ifft(dataX)*n;
figure(2)
subplot(211)
plot(data(:,1),data(:,2)), xlabel('Time(sec)')
legend('original data')
title('inverse fourier transform')
subplot(212)
plot(data(:,1),real(recon_data),'-r')
legend('reconstruction data')
.

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeFourier Analysis and Filtering についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by