Finding Fourier coefficients from signal
56 ビュー (過去 30 日間)
古いコメントを表示
I have a signal that has been processed to give the sinusoidal wave shown in the figure below, is there way i can automatically generate the first 'n' fourier coefficients for this signal?
0 件のコメント
採用された回答
Aghamarsh Varanasi
2021 年 3 月 19 日
編集済み: Aghamarsh Varanasi
2021 年 3 月 19 日
Hi,
There are three posible methods to achieve this
1. Create a custom equation in the Curve Fitting Toolbox defining as many coefficients as you like.
2. Compute the FFT of the signal and modify it as appropriate.
If you have N data points in your signal, then the FFT essentailly gives you the discrete Fourier coefficients for the first N/2 frequencies. Using all of these coefficients would allow you to reconstruct a curve that passes through all of your data exactly. If you wanted a filtered fit, then you could set some of the terms in the FFT corresponding to higher order frequencies equal to zero.
3. Use a submission on the File Exchange.
There is also a MathWorks File Exchange submission for computing Fourier series approximations in a very straightforward manner:
This function directly returns the coefficients of the series (to find them from the FFT you would have to do some manipulation of the complex-valued vector of FFT data using ABS and ANGLE), and it computes the fit based on least squares rather than simply setting higher frequencies equal to zero and using the lower order terms of the FFT.
Below is some sample code comparing the methods 2 and 3. To run the code first download the file Fseries.m from the File Exchange link above. Note that The MathWorks does not guarantee or warrant the use or content of these submissions. Any questions, issues, or complaints should be directed to the contributing author.
close all
N = 128;%number of data points in signal
%make some data
t = 1:N;
x=rand(1,N)+4;
%fft of data
fftx = fft(x);
%maximum harmonic for fit
maxHar = 20;
%maxHar must be less than or equal to ceil(N/2)+1
if maxHar > ceil(N/2) + 1
maxHar = ceil(N/2) + 1;
end
%set terms in FFT corresponding to frequencies above maxHar equal to 0
fftxMod = fftx;
fftxMod(maxHar+2:end-maxHar) = 0;
%file exchange submission
[afit bfit yfit] = Fseries(t,x,maxHar);
figure
hold on
plot(t,x)
plot(t,ifft(fftxMod),'r')
plot(t,yfit,'g')
legend('original data',['filtered FFT to ',num2str(maxHar),' frequencies'],['Fit with Fseries to ',num2str(maxHar),' frequencies'])
0 件のコメント
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Transforms についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!