- 이산 Fourier 변환(DFT) 은 통신과 신호 처리의 핵심 도구지만, 주파수 영역이 현실을 해석하는 유일한 방식은 아님
- DCT처럼 입력 샘플에 기저 함수 값을 곱해 주파수 bin을 구하는 구조에서는, 기저를 바꾸는 것만으로 다른 규칙의 주파수 영역을 만들 수 있음
- Walsh 행렬은
+1과-1만 쓰는 정사각파 기저를 제공하며, sequency와 직교성을 맞추면 시간 영역과 주파수 표현을 왕복할 수 있음 - Hadamard 행렬은 Walsh 행렬을 재정렬한 형태로, Kronecker product나 비트 연산으로 만들고 행을 sequency 기준으로 다시 정렬해 WHT에 활용함
- 같은 입력도 DCT에서는 여러 조화 성분으로 퍼지고 Walsh-Hadamard 변환에서는 정사각파 성분으로 나뉘어, DFT가 “진실”을 독점하지 않음을 보여줌
Fourier 주파수 영역을 다시 보기
- 주파수 영역은 복잡한 신호를 사인파의 진폭과 위상으로 바꿔 표현하는 수학적 공간임
- 이 표현 덕분에 시간 영역이나 공간 영역에서 직접 다루기 어려운 신호 처리 작업을 더 쉽게 수행할 수 있음
- DFT는 통신과 신호 처리에서 중심적 역할을 하지만, 정사각파를 홀수차 사인 조화파의 합으로 바꾸는 해석이 현실의 유일한 해석인지는 별개의 문제임
- 사인파는 자연에 널리 존재해 Fourier 계열 도구가 많은 작업에 잘 맞지만, 다른 규칙으로 동작하는 잘 정의된 주파수 영역도 만들 수 있음
DCT를 기저 함수로 이해하기
- 이산 코사인 변환(DCT)은 DFT의 단순화된 실수 전용 버전으로 볼 수 있음
- DCT-II는 입력 값
s_n에 특정 코사인 식의 값을 곱한 뒤 합산해 특정 주파수 binF_k의 크기를 구함 - 핵심은 현재 DCT bin 번호에 해당하는 주파수의 코사인파를 만드는 기저 함수임
- 일반화하면
B(k, n)이k와n에 따라 multiplier를 반환하고, 이를 입력 샘플과 곱해 합산하는 구조가 됨 - 소프트웨어 관점에서는
B(k, n)을 조회 배열로, 수학적으로는 행렬로 볼 수 있음 N=16DCT 기저 행렬에서 첫 행k=0은 0Hz에 해당하는 DC 성분이며, 모든 값이+1.00인 코사인임- 이후 행들은 반 주기, 한 주기, 한 주기 반처럼 점차 빠르게 변하는 코사인 형태를 가짐
정사각파 기저와 Walsh 행렬
- 사인 주파수가 아니라 정사각파로 신호를 나누는 기저 함수는 Walsh 행렬로 만들 수 있음
- Walsh 행렬은 서로 다른 속도로 움직이는 정사각파들로 구성되며, 모든 multiplier가
+1또는-1임 - 계산은 입력 데이터 일부의 부호를 뒤집고 합산하는 방식으로 단순해짐
- 단순해 보이는 행렬도 두 조건을 만족해야 함
- 각 행은 이전 행보다 부호 전환이 하나 더 많은 sequency 순서를 가져야 함
- 시간 영역 데이터와 주파수 표현 사이를 매끄럽게 왕복하려면 직교성을 유지해야 함
- Walsh 행렬을 직접 만들려면
N×N배열에서 시작하며,N은 2의 거듭제곱이어야 함- 왼쪽 첫 열에 모든 행의
+1을 넣음 - 새 열을 기존 값의 거울 복사로 만들고, 새로 추가한 영역을 여러 수평 구간으로 나눠 일부 구간의 부호를 뒤집음
- 반복마다 열을 복사하고 행 구간 수를 늘려 번갈아 부호를 뒤집음
- 왼쪽 첫 열에 모든 행의
Hadamard 행렬에서 Walsh 배열 만들기
- 문헌과 오픈소스 코드에서는 Walsh 배열을 직접 만들기보다 Hadamard 행렬에서 유도하는 경우가 많음
- Hadamard 행렬은 Walsh 배열의 행 순서를 바꾼 형태임
- 예를 들어
N=16에서 Walsh의 row #15는 Hadamard에서 #1로 이동하고, Walsh의 row #1은 #8에 놓임
- 예를 들어
- Hadamard 구성이 먼저 역사적으로 등장했고 Walsh가 그 위에 구축됐다는 점이 이런 관례의 한 이유임
- 실용적으로는 Hadamard 행렬을 만드는 방법이 더 잘 문서화되어 있으며, 간단하고 효율적인 비트 조작 방식도 있음
- 교과서적 구성은
1×1배열에서 시작해 이전 행렬H_{n-1}을 4개 타일로 복사하는 방식임- 왼쪽 위, 오른쪽 위, 왼쪽 아래는 그대로 복사함
- 오른쪽 아래는 모든 부호를 뒤집음
- 이 확장에는 Kronecker product 표기
⊗가 쓰이지만, 실제 동작은 복사와 부호 반전임
- 구성 단계를
n번 거치면 Hadamard 행렬의 크기는 항상2^n × 2^n이 됨 - 특정 셀의 Hadamard 값은
x & y를 계산한 뒤, 결과에서 켜진 bit 수가 짝수인지 홀수인지로 구할 수 있음- 켜진 bit 수가 홀수면
-1, 짝수면+1 - C 코드에서는
__builtin_popcount(x & y) % 2로 구현함
- 켜진 bit 수가 홀수면
Walsh-Hadamard 변환 구현
- Hadamard 행렬을 직관적인 Walsh 순서로 바꾸려면 행을 sequency 기준으로 정렬해야 함
- 가장 단순한 방법은 각 행에서 부호 변화 횟수를 세는 것임
- 다른 비트 조작 방식도 가능함
- Walsh 행 번호를 자기 자신을 1bit 오른쪽으로 민 값과 XOR해 Gray code를 만듦
- 마지막
nbit의 순서를 뒤집어 Hadamard 행 매핑을 계산함
- 이렇게 만든 Walsh 배열로 DCT 구현의 기저를 바꾸면 “discrete square transform”과 역변환을 만들 수 있음
- 기술적으로 이 변환은 Walsh–Hadamard transform(WHT) 임
- 예시 입력
1 1 1 1 5 5 5 5를 DCT로 처리하면 여러 주파수 bin에 조화 성분이 퍼짐DCT : +24.00 -10.25 -0.00 +3.60 +0.00 -2.41 -0.00 +2.04
- 같은 입력을 정사각파 변환으로 처리하면
F_0과F_1에만 0이 아닌 성분이 나타남SQFT : +24.00 -16.00 +0.00 +0.00 +0.00 +0.00 +0.00 +0.00
- 역변환
isqft()는 원래 입력을 복원함ISQFT : +1.00 +1.00 +1.00 +1.00 +5.00 +5.00 +5.00 +5.00
스펙트로그램 비교와 실용적 위치
- Gorillaz의 “DARE”에서 가져온 11초 오디오 클립으로 DCT 스펙트로그램과 Walsh-Hadamard 스펙트로그램을 비교함
- Walsh-Hadamard 변환은 낮은 성능의 컴퓨터에서도 계산 효율이 좋고, 특정 유형의 데이터에 잘 맞아 몇몇 틈새 용도로 쓰임
- 결론은 WHT를 더 많이 써야 한다는 것이 아니라, 이산 Fourier 변환이 진실을 독점하지 않는다는 점임
- 스펙트로그램은 44.1kHz mono 오디오 파일에서 DCT와 WHT로 계산됨
- 입력 샘플 window는
512 - transform stepover는
1 - 출력 배열 크기는 약
512 × 485k - 픽셀 강도는 정규화한 절댓값에 gamma 약
0.4를 적용함 - 이미지는 Lanczos resampling으로 리사이즈하고, 검정–하늘색–흰색 선형 colormap으로 렌더링함
- 입력 샘플 window는
- Walsh-Hadamard를 이미지 압축에 실험한 사례로
http://rotormind.com/blog/2019/hadamard-days-night/가 함께 소개됨