مهندسی عمران-زلزله(محمدجواد خسرویانی)
مهندسی عمران-زلزله(محمدجواد خسرویانی)

مهندسی عمران-زلزله(محمدجواد خسرویانی)

رسم طیف فوریه و معکوس فوریه برای یک سیگنال در متلب

گاهی اوقات برای مشاهده فرکانس یک سیگنال یا رکورد زلزله نیاز می باشد که محدوده فرکانسی سیگنال مشخص گردد و برای کارهای دیگر مورد استفاده قرار گیرد. یک راه آن استفاده از سیسمو سیگنال هست که به راحتی نمودار فرکانسی رکورد را رسم می کند اما راه دوم  استفاده از کد فوریه FFT  در متلب می باشد که به راحتی با نوشتن کدی می توان برای هر رکورد یا سیگنالی می توان طیف فوریه را رسم کرد و نمودار دامنه بر حسب فرکانس رو مشاهده کرد.


برای مثال در شکل زیر رکورد زلزله تفت رو می بینید



حال با استفاده از کد زیر می توان تبدیل فوریه سیگنال بالا رو رسم کرد: timestep: 0.01 sec

%%% FFT- Mathlab Code....M.Khosraviani...2016/7/17
%%FFT 0f Taft Record%%

x1=a1
na=length(x1) ;
n=nextpow2(na) ;
ffta=fft(x1,2^n);
ampffta=abs(ffta(1:length(ffta)/2))*timestep;
f=1/(2*timestep)*linspace(0,1,length(ampffta)) ;
plot(f,ampffta) ;
xlabel('Frequency(Hz)');
ylabel('Amplitude');
title('FFT of First Floor');
grid on;
figure;

در کد بالا x1=  ما هست inputهمون سیگنال شما یا شتاب یا هر مقدار دیگری است که فرکانسش رو نیاز داریم با بهتره بگیم

در نهایت طیف به شکل زیر  رسم می شود:


همچنین در زیر مثالی آورده شده از معکوس فوریه:

N = 1000;
t0 = 1e-13;
tau = 2*1e-14;
n = [0:t0/40:2*1e-13-t0/40];
f0 = 3*1e8/(150*1e-9);

x = cos(2*pi*f0*n);
x = x.*exp((-(n-t0).^2)./(tau^2));
%  X = abs(fft(x,N));  <-- Not seen this technique before, and why N=1000?
% try something more like:
X = fft(x);

F = [-N/2 : N/2 - 1]/N;
% this is fine to shift and plot the function
Xshifted = fftshift(X);
plot( abs( Xshifted ) )
% now you're taking the inverse of the shifted function, not what you want
% y=ifft(X,80);  also not sure about the 80
y = ifft(X);

figure(3)
plot(n,y)
figure(4)
plot( n, x ); hold on; plot( n, y, 'o' )

که در نهایت منحنی های فوریه و معکوس اون به شکل زیر می شوند: