まず、この質問の背景の詳細については、How to plot temporal frequency as a function of spatial frequency from a MATLAB FFT2 output of a time-space image?を参照してください。2D FFTプロットを正しい周波数(Matlab)に正規化する方法は?
n = [0:1024];
signal = sin(2*pi*n/10) + sin(2*pi*n/20) + sin(2*pi*n/30);
N = 2048; %At least twice of the n value
X = abs(fft(signal,N));
X = fftshift(X); %normalise data
F = [-N/2:N/2-1]/N; %normalise data - shift it to the correct frequency
plot(F,X);
ここで変数Fの範囲は、以下に
からx軸の正規化をソートするものである: - このサンプル信号の場合に仮定
しかし、私は2D FFTプロットのx軸とy軸の値を正規化する方法を見つけ出すのに苦労しています(プロットの画像は、この記事の最初の文で上のリンクにあります)。
誰かがこれをどうやってやるべきかを知る手がかりはありますか?
私のコードの作業部分の抜粋は以下のとおりです。 -
clear;
deg_speed = 15.35; %degrees visual angle/sec
max_speed = deg_speed/5.15; %converting the required deg_speed in terms of frames
nr_of_dots = 10; %number of dots
sin_cycle_dur = 80; %number of frames (along Nt) required to complete a sin wave.
sineTOTAL = 0;
Nx = 160; % Frames along x-axis. 1 frame = 0.1 dva
Nt = 200; % Frames along y-asis. 1 frame = 10ms
start_dot_pos = round(rand(1,nr_of_dots) .* Nx); %spawn random starting positions of dots
dot_pos = zeros(Nt, nr_of_dots); %Initialise 2D stimulus array
dot_pos(1,:) = start_dot_pos; %Fill up first line of 2D array with the starting position of dots
dot_pos_sim = zeros(Nt, nr_of_dots); %Setup simulated array so the final dot_pos can be scaled to mean speed of outher condition
dot_pos_sim(1,:) = start_dot_pos; %Fill up first line of 2D array with the starting position of dots
for a = 2:Nt
sine_speed = max_speed .* sin((a-1)/sin_cycle_dur *2*pi); %Sine formula
sineTOTAL = sineTOTAL + abs(sine_speed); %Add all sine generated values from Sine formula to get an overall total for mean calculation
dot_pos_sim(a,:) = dot_pos_sim(a-1,:) + max_speed .* sin((a-1)/sin_cycle_dur *2*pi); %Sine simulated matrix (before scaling)
end
%Ignore this for loop for now. This is later required for normalising simulated
%array to the mean speed across other conditions.
for b = 1:Nt
dot_pos(b,:) = dot_pos_sim(b,:);
end
dot_pos = round(dot_pos); %Frames are in integers, therefore all float values needed to be rounded up.
dot_pos = mod(dot_pos,Nx)+1; %Wrap the dots the go beyond the edges to the other side of the plot
%For all of the slots filled with dots, set the value from 0 to 1.
for c = 1:Nt
stim(c,dot_pos(c,:)) = 1;
end
figure (1)
x=linspace(0,16,5);
y=linspace(0,2,10);
imagesc(x,y,stim);
xlabel('degrees');
ylabel('seconds');
colormap('gray');
X = abs(fft2(stim));
X = fftshift(X); %normalise data
X = log(1+X);
figure (2)
imagesc(X);
colormap('gray');
私はこれまでのガイドを見つけて、オンライン助けようとしたが無駄にされています。どんな助けでも大歓迎です!
こんにちは、ありがとう!私はこれでどこかになっていると思う。私が今見ている1つの問題は、オリジナルの刺激画像のプロットが、あなたの事例であらかじめ定義された-2と3Hzよりもはるかに複雑であることです。私が働いているのは、完全な罪の動きサイクルが800ms(すなわち80フレーム)で完了し、刺激が15.35度/秒で移動し、合計15.35/1000 * 800度の視角が80ms以内にあるということです。私はそれがあなたの例のためにfxとfyを定義しているので、それがどのようにHz(ここでは物理ダミー)に変換できるかについてはあまりよく分かりません。あなたはこれについて助言を持っていますか? –
私の直感は、x軸が160列にわたって0〜16度の範囲を表し、y軸が0〜160度の範囲を表すので、xの隙間値を(0,16,160)に、yを(0,2,200) 200行以上2秒。私はそうする権利がありますか?私はこれを試してみましたが、y軸は信じられない範囲(-40〜40Hz)を作りましたが、x軸は10倍小さい(-4〜4)と思われました。 0〜16の間。 –
(-2、3)で複素指数を表示するという私の目標は、周波数領域データを生成する手順が正しいことを確認することでした。コードスニペットを 'x'、' y'、 'im'(時間領域データ' im'の水平 'x'と垂直' y'サンプリング位置)を受け取り、 fx'、 'fy'、および' imF'(周波数領域データ 'imF'の水平および垂直サンプリング位置' fx'および 'fy')の3つの出力は正しいものでなければなりません:正しい最小値/周波数については、そして、周波数領域データの正しいスケーリング。これは理にかなっていますか? –