Я ищу простой алгоритм для быстрого DCT и IDCT матрицы

Я ищу простой алгоритм для выполнения быстрого DCT (тип 2) матрицы любого размера [NxM], а также алгоритм для обратного преобразования IDCT (также называемый DCT type 3).

Мне нужен алгоритм DCT-2D, но даже алгоритм DCT-1D достаточно хорош, потому что я могу использовать DCT-1D для реализации DCT-2D (и IDCT-1D для реализации IDCT-2D).

PHP-код предпочтительнее, но любой алгоритм, который достаточно ясен, будет делать.

Мой текущий PHP-скрипт для реализации DCT / IDCT очень медленный, когда размер матрицы больше, чем [200×200].

Я пытался найти способ преформировать DCT до [4000×4000] менее чем за 20 секунд. Кто-нибудь знает как это делать?

Вот мой расчет 1D FDCT и IFDCT с помощью FFT с одинаковой длиной:

 //--------------------------------------------------------------------------- void DFCTrr(double *dst,double *src,double *tmp,int n) { // exact normalized DCT II by N DFFT int i,j; double nn=n,a,da=(M_PI*(nn-0.5))/nn,a0,b0,a1,b1,m; for (j= 0,i=n-1;i>=0;i-=2,j++) dst[j]=src[i]; for (j=n-1,i=n-2;i>=0;i-=2,j--) dst[j]=src[i]; DFFTcr(tmp,dst,n); m=2.0*sqrt(2.0); for (a=0.0,j=0,i=0;i=0;i-=2,j++) dst[i]=src[j]-m; for (j=n-1,i=n-2;i>=0;i-=2,j--) dst[i]=src[j]-m; } //--------------------------------------------------------------------------- 
  • dst – целевой вектор [n]
  • src – исходный вектор [n]
  • tmp – это временный вектор [2n]

Эти массивы не должны пересекаться !!! Это взято из classа трансформации мины, поэтому я, надеюсь, не забыл что-то копировать.

  • XXXrr означает, что пункт назначения является реальным, а источник также является реальным доменом
  • XXXrc означает, что назначение является реальным, а источник – сложным доменом
  • XXXcr означает, что назначение является сложным, а источник – это реальный домен

Все данные представляют собой double массивы, для первого числа сложных доменов – Реальная и вторая мнимая часть, поэтому массив имеет размер 2N . Обе функции используют FFT и iFFT, если вам нужен код и для них комментировать меня. Просто, чтобы быть уверенным, я добавил не быструю их реализацию ниже. Гораздо проще скопировать это, потому что быстрые используют слишком большую иерархию classов преобразования

медленная реализация DFT, iDFT для тестирования:

 //--------------------------------------------------------------------------- void transform::DFTcr(double *dst,double *src,int n) { int i,j; double a,b,a0,_n,q,qq,dq; dq=+2.0*M_PI/double(n); _n=2.0/double(n); for (q=0.0,j=0;j 

Поэтому для тестирования просто переписывайте имена в DFFTcr и iDFFTrc (или используйте их для сравнения с вашим FFT,iFFT ), когда код работает правильно, а затем реализуйте свой собственный FFT, iFFT. Для получения дополнительной информации см.

  • Как вычислить дискретное преобразование Фурье?

2D DFCT

  1. изменять размер матрицы src до степени 2

    добавив нули, чтобы использовать быстрый алгоритм, размер должен быть всегда мощностью 2 !!!

  2. выделить NxN реальные матрицы tmp,dst и 1xN комплексный вектор t

  3. преобразовывать линии по DFCTrr

     DFCT(tmp.line(i),src.line(i),t,N) 
  4. транспонировать матрицу tmp

  5. преобразовывать линии по DFCTrr

     DFCT(dst.line(i),tmp.line(i),t,N) 
  6. транспонировать dst матрицу

  7. нормализовать dst умножением матрицы на 0.0625

2D iDFCT

iDFCTrr же, что и выше, но используйте iDFCTrr и умножьте на 16.0 вместо этого.

[Заметки]

Перед реализацией собственных FFT и iFFT убедитесь, что они дают тот же результат, что и мой, иначе DCT / iDCT не будет работать должным образом !!!

  • Что такое хеширование паролей?
  • Программирование Загадка: как вы можете перевести имя столбца Excel в число?
  • Как найти, какие элементы находятся в сумке, используя алгоритм Knapsack Algorithm ?
  • Каков самый быстрый алгоритм для вычисления минимального расстояния между двумя наборами точек?
  • Наибольший простой коэффициент числа
  • Как рассчитать истекшее время с Joda-Time?
  • Поиск наилучшей точки компромисса на кривой
  • Поиск максимума для каждого windows размера k в массиве
  • Как вычислить OBB нескольких кривых?
  • Сопоставление двух целых чисел с единым, уникальным и детерминированным образом
  • Быстрые и простые комбинации hash-кодов
  • Давайте будем гением компьютера.