Этот пример показывает, как использовать преобразование Уолша-Адамара (WHT) и некоторые из его свойств путем демонстрации двух приложений: связи с использованием расширенного спектра и обработки сигналов ЭКГ.
WHT используются во многих различных приложениях, таких как анализ спектра степени, фильтрация, обработка речевых и медицинских сигналов, мультиплексирование и кодирование в коммуникациях, характеристика нелинейных сигналов, решение нелинейных дифференциальных уравнений, логический проект и анализ.
WHT является субоптимальным, не синусоидальным, ортогональным преобразованием, которое разлагает сигнал на набор ортогональных, прямоугольных сигналов, называемых функциями Уолша. Преобразование не имеет умножителей и реально, потому что амплитуда функций Уолша (или Адамара) имеет только два значения, + 1 или -1.
Функции Уолша являются прямоугольной или квадратной формой волны со значениями -1 или + 1. Важной характеристикой функций Уолша является последовательность, которая определяется из количества пересечений нулем на единичный временной интервал. Каждая функция Уолша имеет уникальное значение последовательности .
Функции Уолша могут быть сгенерированы многими способами (см. [1]). Здесь мы используем hadamard
функция в MATLAB ® для генерации функций Уолша. Длина восьми функций Уолша сгенерированы следующим образом.
N = 8; % Length of Walsh (Hadamard) functions
hadamardMatrix = hadamard(N)
hadamardMatrix = 8×8
1 1 1 1 1 1 1 1
1 -1 1 -1 1 -1 1 -1
1 1 -1 -1 1 1 -1 -1
1 -1 -1 1 1 -1 -1 1
1 1 1 1 -1 -1 -1 -1
1 -1 1 -1 -1 1 -1 1
1 1 -1 -1 -1 -1 1 1
1 -1 -1 1 -1 1 1 -1
Строки (или столбцы) симметричного hadamardMatrix
содержат функции Уолша. Функции Уолша в матрице не расположены в порядке увеличения их последовательностей или количества пересечений нулем (то есть 'порядок последовательности'), а расположены в 'порядке Адамара'. Матрица Уолша, содержащая функции Уолша вдоль строк или столбцов в порядке возрастания их последовательностей, получается изменением индекса hadamardMatrix
следующим образом.
HadIdx = 0:N-1; % Hadamard index M = log2(N)+1; % Number of bits to represent the index
Каждый столбец индекса последовательности (в двоичном формате) задается сложением по модулю-2 столбцов обратного по битам индекса Адамара (в двоичном формате).
binHadIdx = fliplr(dec2bin(HadIdx,M))-'0'; % Bit reversing of the binary index binSeqIdx = zeros(N,M-1); % Pre-allocate memory for k = M:-1:2 % Binary sequency index binSeqIdx(:,k) = xor(binHadIdx(:,k),binHadIdx(:,k-1)); end SeqIdx = binSeqIdx*pow2((M-1:-1:0)'); % Binary to integer sequency index walshMatrix = hadamardMatrix(SeqIdx+1,:) % 1-based indexing
walshMatrix = 8×8
1 1 1 1 1 1 1 1
1 1 1 1 -1 -1 -1 -1
1 1 -1 -1 -1 -1 1 1
1 1 -1 -1 1 1 -1 -1
1 -1 -1 1 1 -1 -1 1
1 -1 -1 1 -1 1 1 -1
1 -1 1 -1 -1 1 -1 1
1 -1 1 -1 1 -1 1 -1
Пара прямого и обратного преобразования Уолша для сигнала x (t) длины N
Быстрые алгоритмы, подобные алгоритму Кули-Тьюки, были разработаны, чтобы реализовать преобразование Уолша-Адамара со сложностью (см. [1] и [2]). Поскольку матрица Уолша симметрична, и прямое, и обратное преобразования являются идентичными операциями, за исключением масштабного коэффициента 1/N. Функции fwht
и ifwht
реализуйте прямой и обратный WHT соответственно.
Пример 1 Выполните WHT на матрице Уолша. Ожидаемым результатом является матрица тождеств, потому что строки (или столбцы) симметричной матрицы Уолша содержат функции Уолша.
y1 = fwht(walshMatrix) % Fast Walsh-Hadamard transform
y1 = 8×8
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1
Пример 2 Создайте прерывистый сигнал путем масштабирования и добавления произвольных столбцов матрицы Адамара. Этот сигнал формируется с использованием взвешенных функций Уолша, поэтому WHT должен возвращать ненулевые значения, равные весам при соответствующих индексах последовательности. При оценке WHT ordering
задается как 'hadamard'
, потому что для получения функций Уолша используется матрица Адамара (вместо матрицы Уолша).
N = 8; H = hadamard(N); % Hadamard matrix % Construct a signal by adding a few weighted Walsh functions x = 8.*H(1,:) + 12.*H(3,:) + 18.*H(5,:) + 10.*H(8,:); y = fwht(x,N,'hadamard')
y = 1×8
8 0 12 0 18 0 0 10
WHT является обратимым преобразованием, и исходный сигнал может быть восстановлен идеально с помощью обратного преобразования. Норма между исходным сигналом и сигналом, полученным из обратного преобразования, равна нулю, что указывает на совершенную реконструкцию.
xHat = ifwht(y,N,'hadamard');
norm(x-xHat)
ans = 0
Преобразование Уолша-Адамара включает расширение с использованием набора прямоугольных форм волны, поэтому оно полезно в приложениях, включающих прерывистые сигналы, которые могут быть легко выражены в терминах функций Уолша. Ниже приведены два применения преобразований Уолша-Адамара.
Обработка сигнала ЭКГ Часто необходимо регистрировать электро-кардиограммные (ЭКГ) сигналы пациентов в разное время. Это приводит к большому объему данных, которые нужно хранить для анализа, сравнения и т.д. в более позднее время. Преобразование Уолша-Адамара подходит для сжатия сигналов ЭКГ, потому что оно предлагает такие преимущества, как быстрый расчет коэффициентов Уолша-Адамара, меньше необходимого пространства памяти, поскольку его достаточно для хранения только тех коэффициентов последовательности с большими величинами и быстрой реконструкции сигнала.
Сигнал ЭКГ и соответствующее ему преобразование Уолша-Адамара оценены и показаны ниже.
x1 = ecg(512); % Single ecg wave x = repmat(x1,1,8); x = x + 0.1.*randn(1,length(x)); % Noisy ecg signal y = fwht(x); % Fast Walsh-Hadamard transform subplot(2,1,1) plot(x) xlabel('Sample index') ylabel('Amplitude') title('ECG Signal') subplot(2,1,2) plot(abs(y)) xlabel('Sequency index') ylabel('Magnitude') title('WHT Coefficients')
Как видно на графике, большая часть энергии сигнала сконцентрирована при более низких значениях последовательности. В целях исследования сохраняются и используются только первые 1024 коэффициента для восстановления исходного сигнала. Усечение более высоких коэффициентов последовательности также помогает с подавлением шума. Исходные и воспроизведенные сигналы показаны ниже.
y(1025:length(x)) = 0; % Zeroing out the higher coefficients xHat = ifwht(y); % Signal reconstruction using inverse WHT figure plot(x) hold on plot(xHat,'r') xlabel('Sample index') ylabel('ECG signal amplitude') legend('Original Signal','Reconstructed Signal')
Воспроизведенный сигнал очень близок к исходному сигналу.
Чтобы восстановить исходный сигнал, мы хранили только первые 1024 коэффициента и длину сигнала ЭКГ. Это представляет степень сжатия приблизительно 4:1.
req = [length(x) y(1:1024)]; whos x req
Name Size Bytes Class Attributes req 1x1025 8200 double x 1x4096 32768 double
Связь с использованием технологий связи на основе спектра Spreed Spectrum, таких как CDMA, использует коды Уолша (выведенные из функций Уолша), чтобы расширить сигналы сообщений и преобразования WHT, чтобы сжать их. Поскольку коды Уолша являются ортогональными, любой сигнал, кодированный Уолшем, появляется как случайный шум для терминала, если только этот терминал не использует тот же самый код для кодирования. Ниже мы покажем процесс расширения, определения кодов Уолша, используемых для расширения, и сжатия, чтобы восстановить сигнал сообщения.
Два терминала МДКР расширяют свои соответствующие сигналы сообщений, используя два различных кода Уолша (также известных как коды Адамара) длины 64. Сигналы расширенного сообщения повреждаются аддитивным белым Гауссовым шумом с отклонением 0,1.
В приемнике (базовой станции) обработка сигнала является некогерентной, и принятая последовательность длины N должна быть коррелирована с 2 ^ N кодовыми словами Уолша, чтобы извлечь коды Уолша, используемые соответствующими передатчиками. Это может быть эффективно сделано путем преобразования принятых сигналов в область последовательности с помощью быстрого преобразования Уолша-Адамара. Используя расположение последовательности, в котором происходит пик, может быть определен соответствующий код Уолша-Адамара (или функция Уолша), используемый. График ниже показывает, что коды Уолша-Адамара с последовательностью (с ordering
= 'hadamard'
) 60 и 10 использовались в первом и втором передатчиках, соответственно.
load mess_rcvd_signals.mat N = length(rcvdSig1); y1 = fwht(rcvdSig1,N,'hadamard'); y2 = fwht(rcvdSig2,N,'hadamard'); figure plot(0:63,y1,0:63,y2) xlabel('Sequency index') ylabel('WHT of the Received Signals') title('Walsh-Hadamard Code Extraction') legend('WHT of Tx - 1 signal','WHT of Tx - 2 signal')
Сжатие (или декодирование) для извлечения сигнала сообщения может быть выполнено простым способом путем умножения принятых сигналов на соответствующие коды Уолша-Адамара, сгенерированные с использованием hadamard
функция. (Обратите внимание, что индексация в MATLAB ® начинается с 1, поэтому коды Уолша-Адамара с последовательностью 60 и 10 получаются из путем выбора столбцов (или строк) 61 и 11 в матрице Адамара.)
N = 64; hadamardMatrix = hadamard(N); codeTx1 = hadamardMatrix(:,61); % Code used by transmitter 1 codeTx2 = hadamardMatrix(:,11); % Code used by transmitter 2
Операция декодирования для восстановления исходного сигнала сообщения
xHat1 = codeTx1 .* rcvdSig1; % Decoded signal at receiver 1 xHat2 = codeTx2 .* rcvdSig2; % Decoded signal at receiver 2
Восстановленные сигналы сообщения на стороне приемника показаны ниже и наложены на исходные сигналы для сравнения.
subplot(2,1,1) plot(x1) hold on plot(xHat1) legend('Original Message','Reconstructed Message','Location','Best') xlabel('Sample index') ylabel('Message signal amplitude') subplot(2,1,2) plot(x2) hold on plot(xHat2) legend('Original Message','Reconstructed Message','Location','Best') xlabel('Sample index') ylabel('Message signal amplitude')
К. Г. Бошан, Приложения Уолша и связанные функции - с введением в теорию секвенсации, академическая пресса, 1984
T. Beer, Walsh Transforms, American Journal of Physics, Vol. 49, Issue 5, May 1981