Прежде всего, обратитесь к 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 и y для графика 2D FFT (изображение для сюжетов доступно по указанной выше ссылке в первом предложении этого сообщения.)
Кто-нибудь знает, как я должен это делать?
Фрагмент рабочей части моих кодов: -
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');
Я пытался найти руководства и помочь в Интернете, но безрезультатно до сих пор. Любая помощь будет принята с благодарностью!
Привет! Думаю, я кое-что с этим поделаю. Единственная проблема, которую я сейчас вижу, это то, что мой исходный участок изображения раздражителя намного сложнее, чем предустановленные -2 и 3 Гц в вашем примере. Значения, с которыми я работаю, заключаются в том, что цикл полного цикла греха завершается в 800 мс (т. Е. 80 кадров), и стимул перемещается (при 15,35 град/с) в общей сложности с углом зрения 15,35/1000 * 800 градусов в пределах 80 мс. Я не совсем уверен, как это можно перевести на Гц (здесь есть фиктивный фикс), что важно, потому что он определяет fx и fy для вашего примера. У вас есть совет для этого? –
Моя интуиция подсказывает мне заменить значения linspace для x на (0,16,160) и y на (0,2,200), так как ось x представляет диапазон от 0 до 16 градусов по 160 столбцам, а ось y, 0- 2 секунды более 200 строк. Правильно ли я это делаю? Я пробовал это, и ось y создала диапазон, который правдоподобен (от -40 до 40 Гц), но ось x создала диапазон в 10 раз меньше (-4-4), предположительно потому, что я определил ось x между 0-16. –
Моя цель показать сложную экспоненту в (-2, 3) состояла в том, чтобы подтвердить, что шаги по генерации данных в частотной области были правильными. Если вы сделаете фрагмент кода в функцию, которая принимает 'x',' y' и 'im' (горизонтальные' x' и вертикальные «выборки» выборки данных временной области 'im') и возвращает' fx', 'fy' и' imF' (горизонтальные и вертикальные местоположения выборки 'fx' и' fy' данных частотной области 'imF'), эти три выхода должны быть« правильными »: правильные значения min/max для частот и правильного масштабирования данных частотной области. Имеет ли это смысл? –