2014-11-30 8 views
2

Я пытаюсь реализовать одномерный DFT без использования встроенных функций Matlab, таких как fft(). Это мой кодMTIMES не поддерживается полностью для целых классов. Как минимум один вход должен быть скаляром

function [Xk] = dft1(xn) 
N=length(xn); 
n = 0:1:N-1; % row vector for n 
k = 0:1:N-1; % row vecor for k 
WN = exp(-1j*2*pi/N); % Twiddle factor (w) 
nk = n'*k; % creates a N by N matrix of nk values 
WNnk = WN .^ nk; % DFT matrix 
Xk = (WNnk*xn); 

, когда я запускаю код после того, как с помощью следующих команд:

I = imread('sample.jpg') 
R = dft1(I) 

я получаю эту конкретную ошибку: ошибки при использовании * MTIMES не полностью поддерживается для целых классов , По меньшей мере один вход должен быть скалярным. Чтобы вычислить по-разному TIMES, используйте вместо этого TIMES (. *).

Может кто-то пожалуйста, помогите мне понять, как решить эту проблему

Примечание: Я еще в самом начале уровня обучения Matlab большое спасибо

ответ

6

Вам просто нужно гипсе данных до double, затем запустите свой код еще раз. В основном, что говорит ошибка, вы пытаетесь объединить классы данных вместе, применяя умножение матрицы между двумя переменными. В частности, числовые векторы и матрицы, которые вы определяете в dft1, являются все типами double, но ваше изображение, вероятно, имеет тип uint8, когда вы читаете это через imread. Вот почему вы получаете эту целую ошибку, потому что uint8 является целым классом, и вы пытаетесь выполнить умножение матрицы с этим типом данных с данными типа double. Имейте в виду, что вы можете смешивать типы данных, если один номер является единственным числом/скаляром. Это также то, о чем говорит ошибка. Матричное умножение переменных, не являющихся плавающей запятой (double, single), не поддерживается в MATLAB, поэтому перед применением вашего алгоритма вам необходимо убедиться, что ваши данные изображения и ваши матрицы DFT являются одним и тем же типом.

Таким образом, просто сделать:

I = imread('sample.jpg'); 
R = dft1(double(I)); 

Minor Примечание

Этот код достаточно умен, и он (по умолчанию) применяет 1D ДПФ для всех столбцов изображения. Выходом будет матрица такого же размера, как I, где каждый столбец является результатом 1D DFT каждого столбца от I.

Это что-то о чем подумать, но если вы хотите применить это ко всем строкам вашего изображения, вы просто переместите I, прежде чем он войдет в dft1, чтобы строки стали столбцами, и вы можете работать с этими новыми «столбцами» ». Как только вы закончите, вам просто нужно перенести результат так, чтобы вы получили свой результат от dft1 до такой степени, чтобы результаты были применены для каждой строки. Поэтому:

I = imread('sample.jpg'); 
R = dft1(double(I.')).'; 

Надеется, что это помогает! Удачи!

+0

Уважаемый @rayryeng, пожалуйста, взгляните на этот вопрос, если у вас есть время, я бы очень признателен, если вы поможете мне решить его. вот ссылка: ссылка http://stackoverflow.com/questions/27237336/dividing- ан-изображение в-н-блок-в-ширина-и-вычисления-на-кр-точка-оф-е – Alladin

 Смежные вопросы

  • Нет связанных вопросов^_^