Matlabでは
fft
という命令だけでFFTしてくれるが使い方に注意!
以下にサンプルで示す。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Matlab FFT sample program
% programming by embedded.samurai
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
echo off
clear all
close all
%サンプリング周期 50[ms]
dt=50e-3;
%サンプリング周波数20Hz 10Hz以下まで表すことができる
df=1/dt;
%離散時間(横軸)を作る
t=[0:dt:50];
%50msごとの離散時間が何個で構成されるか調べる
[gyo retu]=size(t)
%gyo行、retu列の0データを作る。
zerodata = zeros(gyo,retu);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 1Hz+2Hz+5Hzの正弦波を表示する
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(2,1,1);
f1=1; %1[Hz]
f2=2; %2[Hz]
f3=5; %5[Hz]
if 1
y1=sin(2*pi*f1*t);
else
y1=zerodata; %0でもうまくいく
end
if 1
y2=sin(2*pi*f2*t);
else
y2=0;
end
if 1
y3=sin(2*pi*f3*t);
else
y3=0;
end
y=y1+y2+y3;
% 1+2+5Hzの正弦波を表示する
plot(t,y,'ro-','linewidth',2);
%stem(t,y,'ro-');
hold on;
axis([0 5 -Inf Inf]);
h=gca;
set(h,'LineWidth',2,...,
'FontSize',15);
xlabel('Time[s]','Fontsize',15);
ylabel('Amplitude','Fontsize',15)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 周波数スペクトルを表示する
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(2,1,2);
data=[];
%基本周波数の導出 基本周波数=サンプリング周波数/データ数
basicfre = df/retu
%FFTの結果は複素数である。複素数はテキストデータで保存できない
fftdata = fft(y(1:retu))';
%分解して、テキストとして保存する
fftdata_re = real(fftdata);
fftdata_im = imag(fftdata);
%離散周波数を作る
data = [data,[0:retu-1]'*df/retu];
%FFTの実部を格納する
data = [data,fftdata_re];
%FFTの虚部を格納する
data = [data,fftdata_im];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 周波数スペクトルの絶対値を求める
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FFTの絶対値を求める
power=abs(fftdata).^2;
maxpower = max(power);
%Normalize(正規化する)
Nmpower = power/maxpower;
%Normalize + [dB/dec]
NmpowerDB = 20*log10(power/maxpower);
%正規化データを格納する
data = [data,Nmpower];
%正規化データ[dB/dec]を格納する
data = [data,NmpowerDB];
plot(data(:,1),data(:,4),'b-','linewidth',2);
axis([0 df/2 0 1]);
h=gca;
set(h,'LineWidth',2,...,
'FontSize',15);
xlabel('Frequency[Hz]','Fontsize',15);
ylabel('Normalize','Fontsize',15);
save fftdata.txt data -ascii
print -djpeg fft_sample.jpg

周波数 FFTの実部 FFTの虚部 FFTの絶対値 FFTの絶対値[dB/dec] 0.0000000e+000 -8.5997875e-013 -0.0000000e+000 2.9701028e-030 -5.9054457e+002 1.9980020e-002 1.0238257e-004 3.2621866e-002 4.2738365e-009 -1.6738364e+002 3.9960040e-002 4.0986708e-004 6.5296747e-002 1.7123646e-008 -1.5532808e+002 5.9940060e-002 9.2346767e-004 9.8078048e-002 3.8634755e-008 -1.4826044e+002 7.9920080e-002 1.6448870e-003 1.3101996e-001 6.8950813e-008 -1.4322921e+002 9.9900100e-002 2.5765350e-003 1.6417786e-001 1.0827599e-007 -1.3930936e+002 1.1988012e-001 3.7215561e-003 1.9760876e-001 1.5687814e-007 -1.3608875e+002 1.3986014e-001 5.0838652e-003 2.3137174e-001 2.1509300e-007 -1.3334747e+002 1.5984016e-001 6.6681924e-003 2.6552845e-001 2.8332961e-007 -1.3095416e+002
データはこのような形で保存しておくとあとで利用しやすい。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% パルス波形を表示
% programming by embedded samurai
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
echo off
clear all
close all
%サンプリング周期 1[ms]
dx=1e-3;
% xの範囲は -pi/2から0.001単位で2piまで
x=[-pi/2:dx:2*pi];
xx = x/pi;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 注意!
% cos(n*x) n=omega
% n=omega=1,2,..,n である。
% omega = 2*pi*f = 1,2,...,n の意味なので
% 周波数的には、
% f= 1/2pi,2/2pi,3/2pi,...,n
% = 0.1592[Hz],0.3183[Hz],0.4775[Hz],0.6366[Hz],
% = 0.7958[Hz],0.9549[Hz],1.1141[Hz],....,n
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 1[Hz]を表示
% ここはテスト
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(1);
ty1=sin(2*pi*1*x);
%1[Hz]に近い
ty2=sin(6.2832*x);
plot(xx,ty1,'r-','linewidth',2);
hold on;
plot(xx,ty2,'b--','linewidth',3);
% xラベルとその文字の大きさ、線の太さの設定
str={'-p/2','0','p/2','p','3p/2','2p'}
set(gca,'FontName','symbol','xtick',[-0.5:.5:2],'xticklabel',str)
set(gca,'LineWidth',2,'FontSize',18)
% x-y範囲
axis([-Inf Inf -Inf Inf]);
grid on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% n=1のとき
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(2);
y1=0;
for m=0:1:0
y=(4/pi)*(1/(2*m+1))*(-1)^m*cos((2*m+1).*x);
y1=y1+y;
end
plot(xx,y1,'r-','linewidth',3);
hold on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% n=10のとき
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
y2=0;
for m=0:1:10
y=(4/pi)*(1/(2*m+1))*(-1)^m*cos((2*m+1).*x);
y2=y2+y;
end
plot(xx,y2,'g-','linewidth',3);
hold on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% n=100のとき
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
y3=0;
for m=0:1:100
y=(4/pi)*(1/(2*m+1))*(-1)^m*cos((2*m+1).*x);
y3=y3+y;
end
plot(xx,y3,'m-','linewidth',3);
hold on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 理想パルス
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data=[];
for n=x
if (n < pi/2)
y=1;
data=[data,y];
elseif (n >= pi/2) && (n <= 3*pi/2)
y=-1;
data=[data,y];
elseif ( n > 3*pi/2)
y=1;
data=[data,y];
end
end
plot(xx,data,'b-','linewidth',3);
hold on;
% xラベルとその文字の大きさ、線の太さの設定
str={'-p/2','0','p/2','p','3p/2','2p'}
set(gca,'FontName','symbol','xtick',[-0.5:.5:2],'xticklabel',str)
set(gca,'LineWidth',2,'FontSize',18)
% x-y範囲
axis([-Inf Inf -Inf Inf]);
grid on
% xラベル、yラベル
xlabel('Positon t','Fontsize',20,'FontName','Century');
ylabel('pulsu wave y(t)','Fontsize',20,'FontName','Century')
% キャプション
h=legend('n=1',...,
'n=10',...,
'n=100',...,
'ideal pulsu',...,
1);
set(h,'FontSize',20,'FontName','Century');
print -djpeg pulsuwave_t.jpeg
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(3);
%サンプリング周波数 1kHz
df=1/dx
%xの数 7854
[gyo retu]=size(x)
%基本周波数 0.1273[Hz]
bf=df/retu
%FFTの結果は複素数である
fftdata1 = fft(y1)';
fftdata2 = fft(y2)';
fftdata3 = fft(y3)';
fftdata4 = fft(data)';
%FFTの絶対値を求める
power1=abs(fftdata1).^2;
power2=abs(fftdata2).^2;
power3=abs(fftdata3).^2;
power4=abs(fftdata4).^2;
%離散周波数を作る
freq = [0:retu-1]'*bf
plot(freq,power1,'r-','linewidth',3);
hold on
plot(freq,power2,'g-','linewidth',3);
hold on
plot(freq,power3,'m+--','linewidth',2);
hold on
plot(freq,power4,'bo-','linewidth',1);
hold on
axis([0 1 0 Inf]);
set(gca,'LineWidth',2,...,
'FontSize',15);
xlabel('Frequency[Hz]','Fontsize',20,'FontName','Century');
ylabel('Normalize','Fontsize',20,'FontName','Century');
% キャプション
h=legend('n=1',...,
'n=10',...,
'n=100',...,
'ideal pulsu',...,
1);
set(h,'FontSize',20,'FontName','Century');
print -djpeg pulsuwave_f.jpg

