Не удается построить результаты быстрого преобразования Фурье Matlab 2D

Я провел двумерное преобразование Фурье на матрице 4436413x3 с помощью команды matlab fft2 (эта: https://www.mathworks.com/help/matlab/ref/fft2.html). Продукт представляет собой матрицу 4436413x3, содержащую комплексные значения. Когда я пытаюсь отобразить данные, я получаю график одного цвета или сообщение об ошибке, которое ссылается на сложные значения в моих данных.

Я попытался интерполировать для создания 2D-набора значений с помощью функции griddata(), однако при применении к моему 3D-набору данных она возвращает 1D-вектор, равный z-столбцу в моем исходном 3D-наборе данных. Мой набор 3D-данных состоит из точек x, y и z, и при попытке интерполяции я использовал vq = griddata(x,y,z,x,y). Я также пытался создать сетку 4436412x3 для своих точек запроса (используя [xq, yq] = meshgrid (4436412, 3), а затем используя xq и yq в качестве точек запроса), но это возвращало NaN.

Когда я бегу Y = fft2(x); imagesc(abs(fftshift(Y))) Я получаю одну фиолетовую коробку.

Когда я бегу Y = fft2(x); изображенияc(Y) Я получаю следующее сообщение об ошибке:

Error using image
Complex values are not supported. Specify the color data as numeric or logical values.

Error in imagesc (line 52)
    hh = image(varargin{:}, 'CDataMapping', 'scaled');

4 миллиона умножить на 3? Это крайнее соотношение сторон для изображения. Вы не должны отображать это как изображение, а лучше отображать 3 столбца в виде линейных графиков. Вы уверены, что хотите выполнить 2D FFT, а не 3 1D FFT?

Cris Luengo 08.12.2022 04:01

Итак, ошибка вполне очевидна и имеет смысл, комплексное значение по сути состоит из 2 значений, поэтому вы не можете построить его как изображение, потому что каждый пиксель может иметь только 1 значение.

Ander Biguri 08.12.2022 12:35

@AnderBiguri, как я могу преобразовать значения в несложные?

bluekangaroo 08.12.2022 18:09

@CrisLuengo Меня попросили выполнить 2Dfft для набора данных. Я знаю, что он огромный - это сканирование поверхности в белом свете с высоким разрешением. Я также запутался в том, как выполнить 2D-преобразование в наборе 3D-данных — я очень давно не думал о преобразованиях Фурье.

bluekangaroo 08.12.2022 18:12

Вы уверены, что 3 — это не размер RGB, а 4M — это не 2000x2000 или что-то в этом роде? Возможно, вы захотите выполнить 2D-БПФ по двум пространственным измерениям, по одному для каждого цветового канала.

Cris Luengo 08.12.2022 18:17

Хммм… 4436413 — простое число. Я предполагаю, что кто-то дергает вас за ногу. Ничего из этого не имеет смысла. Зачем сканеру создавать массив с простым числом выборок?

Cris Luengo 08.12.2022 18:20

@CrisLuengo Не должно быть измерения RGB, потому что для сканирования нет данных о цвете. Мы пытаемся количественно определить шероховатость поверхности, поэтому сканирование записывает только расстояние от поверхности до сканера в z-измерении по каждой координате x и y. Первоначально в наборе данных было 9006000 наблюдений, однако для многих из них не было данных о высоте, и поэтому они были опущены (оставив мне 4436413 наблюдений). Никто не «тянет меня за ногу» — я делаю это как последний проект для класса.

bluekangaroo 08.12.2022 20:05

О, так один из ваших столбцов равен x, другой — y, а третий — z? Это имеет гораздо больше смысла. Не рассматривайте это как двумерный массив, это облако точек. Применять к нему БПФ нет смысла. Если вы хотите использовать БПФ, вам нужно будет интерполировать, чтобы создать двумерный массив значений z, выбранных на регулярной сетке x-y. Вы также можете попробовать 2D-неоднородное БПФ (nuFFT), но не уверены, насколько хорошо они работают.

Cris Luengo 08.12.2022 20:32

@CrisLuengo Большое спасибо за помощь. Можете ли вы сказать мне, как сделать этот тип интерполяции, или указать мне ресурс, который может научить меня, как это сделать? Я никогда не делал ничего подобного раньше.

bluekangaroo 08.12.2022 21:00

Используйте эту функцию: mathworks.com/help/matlab/ref/griddata.html

Cris Luengo 08.12.2022 21:15

@CrisLuengo Спасибо, но не похоже, что это решает мою проблему. Я все еще получаю график, который все только один цвет.

bluekangaroo 11.12.2022 20:29

На этот вопрос пока нет ответов, поэтому вы можете обновить его, указав то, что уже сделали. Сказать «это не сработало», не показав, что это такое, не позволяет мне помочь.

Cris Luengo 11.12.2022 20:32

@CrisLuengo Извините за абстрактность. Я обновил вопрос - все еще пытаюсь сопоставить мой набор 3D-данных с 2D.

bluekangaroo 12.12.2022 08:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
13
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы применить БПФ, вам нужно, чтобы данные были выбраны на регулярной сетке. Ваши данные представляют (x, y, z) координаты точек. Вот как использовать griddata для повторной выборки этих координат в обычную (x, y) сетку:

% Generate example data, let's say x and y are in the range [-3,3]:
n = 62500;
x = rand(n, 1) * 6 - 3;
y = rand(n, 1) * 6 - 3;
z = sin(4*x) + cos(2*y); % an example function
data = [x,y,z]; % This is a 4436413x3 array with (x,y,z) coordinates

% Interpolate z values onto a regular (x,y) grid:
[xq, yq] = meshgrid(linspace(min(x), max(x), sqrt(n)), ...
                    linspace(min(y), max(y), sqrt(n)));
zq = griddata(x, y, z, xq, yq);

% griddata doesn't extrapolate, writes NaN instead. Let's fill those
% in with zeros (maybe a different value is more meaningful in your
% application).
zq(isnan(zq)) = 0;

% Now you can apply a 2D Fourier transform:
Z = fft2(zq);
imshow(log(abs(fftshift(Z))), []);

Я сделал это, используя [xq, yq] = meshgrid(linspace(min(x), max(x), 2), ... linspace(min(y), max(y), 4436413)), создав 4436413x2 zq . Я думаю, это то, что я хотел, учитывая, что я хочу набор 2D-данных? Есть ли причина, по которой я должен интерполировать на квадратную сетку?

bluekangaroo 13.12.2022 05:20

@bluekangaroo Почему вы выбрали ось x только дважды, а ось y - 4 миллиона раз? Вам не нужна квадратная сетка, но вам нужна разумная сетка. Начните с scatter3(x,y,z) и посмотрите на свои данные. Как отбираются точки? Теперь выберите сетку, которая имеет смысл, когда вы смотрите на нее. Решите, как вы хотите разделить каждую ось. Затем постройте эту сетку с помощью meshgrid.

Cris Luengo 13.12.2022 07:00

Другие вопросы по теме