Я ищу простой алгоритм для быстрого DCT и IDCT матрицы
Я ищу простой алгоритм для выполнения быстрого DCT (тип 2) матрицы любого размера [NxM], а также алгоритм для обратного преобразования IDCT (также называемый DCT type 3).
Мне нужен алгоритм DCT-2D, но даже алгоритм DCT-1D достаточно хорош, потому что я могу использовать DCT-1D для реализации DCT-2D (и IDCT-1D для реализации IDCT-2D).
PHP-код предпочтительнее, но любой алгоритм, который достаточно ясен, будет делать.
- Потребность в предсказуемом случайном генераторе
- Создать произвольную перестановку 1..N в постоянном пространстве
- В Java, как эффективно и элегантно потопить потомков узла дерева?
- Алгоритм выбора колеса рулетки
- Взвешенный случайный выбор из массива
Мой текущий PHP-скрипт для реализации DCT / IDCT очень медленный, когда размер матрицы больше, чем [200×200].
Я пытался найти способ преформировать DCT до [4000×4000] менее чем за 20 секунд. Кто-нибудь знает как это делать?
- Каков наиболее эффективный способ кодирования произвольного GUID в читаемый ASCII (33-127)?
- Головоломка: найдите самый большой прямоугольник (проблема с максимальным прямоугольником)
- Пиковое обнаружение измеренного сигнала
- Страtagsи упрощения математических выражений
- Слияние Сортировка связанного списка
- Есть ли простой алгоритм, который может определить, является ли X простым, а не путать простого смертного программиста?
- Зеркальное изображение двоичного дерева
- Уникальные (не повторяющиеся) случайные числа в O (1)?
Вот мой расчет 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
-
изменять размер матрицы
src
до степени2
добавив нули, чтобы использовать быстрый алгоритм, размер должен быть всегда мощностью
2
!!! -
выделить
NxN
реальные матрицыtmp,dst
и1xN
комплексный векторt
-
преобразовывать линии по
DFCTrr
DFCT(tmp.line(i),src.line(i),t,N)
-
транспонировать матрицу
tmp
-
преобразовывать линии по
DFCTrr
DFCT(dst.line(i),tmp.line(i),t,N)
-
транспонировать
dst
матрицу -
нормализовать
dst
умножением матрицы на0.0625
2D iDFCT
iDFCTrr
же, что и выше, но используйте iDFCTrr
и умножьте на 16.0
вместо этого.
[Заметки]
Перед реализацией собственных FFT и iFFT убедитесь, что они дают тот же результат, что и мой, иначе DCT / iDCT не будет работать должным образом !!!