Циклическое вращение компенсирует отсутствие инвариантности сдвига в критически дискретизированном вейвлет-преобразовании путем усреднения по деноизированным циклически сдвинутым версиям сигнала или изображения. Соответствующий оператор обратного циклического сдвига применяется к деноизированному сигналу/изображению, и результаты усредняются вместе для получения конечного деноизированного сигнала/изображения.
Существует N уникальных циклически сдвинутых вариантов сигнала длины, N. Для изображения M-by-N имеются MN вариантов. Это делает использование всех возможных сдвинутых версий запредельным в вычислительном отношении. Однако на практике хорошие результаты можно получить, используя небольшое подмножество возможных циклических сдвигов.
В следующем примере показано использование wdenoise и circshift для обессоливания 1-D сигнала с помощью кручения цикла. Для обесцвечивания изображений в градациях серого и RGB, wdenoise2 поддерживает круговое прядение.
В этом примере показано, как подавить сигнал 1-D с помощью циклического вращения и ортогонального нерезервирующегося вейвлет-преобразования со сдвигом. В примере сравниваются результаты двух методов деноизирования.
Создайте шумный сигнал ударов 1-D с отношением сигнал-шум 6. Отношение сигнал/шум определяется как | 22, где N - длина | X | | 22 - норма L2 в квадрате, а, ((2) - дисперсия шума.
rng default [X,XN] = wnoise('bumps',10,sqrt(6)); subplot(2,1,1) plot(X) title('Original Signal') subplot(2,1,2) plot(XN) title('Noisy Signal')

Денуазировать сигнал, используя кручение цикла с 15 сдвигами, 7 влево и 7 вправо, включая сигнал с нулевым сдвигом. Использовать wdenoise с настройками по умолчанию. По умолчанию wdenoise использует наименее асимметричный вейвлет Daubechies с четырьмя исчезающими моментами, sym4. Деноизинг снижен до минимума floor(log2(N)) и wmaxlev(N,'sym4') где N - количество выборок в данных.
ydenoise = zeros(length(XN),15); for nn = -7:7 yshift = circshift(XN,[0 nn]); [yd,cyd] = wdenoise(yshift); ydenoise(:,nn+8) = circshift(yd,[0, -nn]); end ydenoise = mean(ydenoise,2);
Денуазировать сигнал с помощью wdenoise. Сравните с результатами кручения цикла.
xd = wdenoise(XN); subplot(2,1,1) plot(ydenoise,'b','linewidth',2) hold on plot(X,'r') axis([1 1024 -10 10]) legend('Denoised Signal','Original Signal','Location','SouthEast') ylabel('Amplitude') title('Cycle Spinning Denoising') hold off subplot(2,1,2) plot(xd,'b','linewidth',2) hold on plot(X,'r') axis([1 1024 -10 10]) legend('Denoised Signal','Original Signal','Location','SouthEast') xlabel('Sample') ylabel('Amplitude') title('Standard Orthogonal Denoising') hold off

absDiffDWT = norm(X-xd,2)
absDiffDWT = 12.4248
absDiffCycleSpin = norm(X-ydenoise',2)
absDiffCycleSpin = 10.6124
Вращение цикла только с 15 сдвигами уменьшило погрешность аппроксимации.