Вращение цикла компенсирует отсутствие инвариантности сдвига в критически дискретизированном преобразовании вейвлета путем усреднения по деноизированным циклически сдвинутым версиям сигнала или изображения. Соответствующий оператор обратного сдвига циркулянта применяется к деноизованному сигналу/изображению, и результаты усредняются вместе, чтобы получить конечный деноизованный сигнал/изображение.
Существует N уникальных циклически сдвинутых версий сигнала длины, N. Для M -by - N изображения существует MN версий. Это делает использование всех возможных сдвинутых версий компьютерно запретительными. Однако на практике хорошие результаты могут быть получены при помощи небольшого подмножества возможных круговых сдвигов.
Следующий пример показывает, как вы используете wdenoise
и circshift
денуазировать сигнал 1-D с помощью вращающегося цикла. Для шумоподавления изображений в полутоновом и RGB, wdenoise2
поддерживает вращение цикла.
Этот пример показывает, как деноцировать сигнал 1-D, используя вращение цикла и ортогональное нерезервированное вейвлет со сдвигом. Пример сравнивает результаты двух методов шумоподавления.
Создайте сигнал шумного 1-D с отношением сигнал/шум 6. Отношение сигнал-шум задано как где - длина сигнала, является квадратной L2 нормой, и - отклонение шума.
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 сдвигами уменьшило ошибку приближения.