Main Content

Tikhonov 정규화를 사용하여 복소수 최소제곱 행렬 해의 고정소수점 데이터형 결정하기

이 예제에서는 fixed.complexQRMatrixSolveFixedpointTypes 함수를 사용하여 복소수 최소제곱 행렬 방정식 해의 고정소수점 데이터형을 해석적으로 결정하는 방법을 보여줍니다.

[λInA]X=[0n,pB],

여기서 Amnm×n 행렬이고, Bm×p이며, Xn×p이고, In=eye(n), 0n,p=zeros(n,p)이며 λ는 정규화 파라미터입니다.

최소제곱해는 다음과 같지만

XLS=(λ2In+ATA)-1ATB

제곱 또는 역수를 취하지 않고 계산됩니다.

시스템 파라미터 정의하기

이 예제에 대한 행렬 특성과 시스템 파라미터를 정의합니다.

m은 행렬 AB의 행 개수입니다. 빔포밍 또는 방향 탐지 같은 문제에서는 m은 적분이 수행되는 샘플의 수에 해당합니다.

m = 300;

n은 행렬 A의 열 개수와 행렬 X의 행 개수입니다. 최소제곱 문제에서 mn보다 크며, 대개 mn보다 훨씬 큽니다. 빔포밍 또는 방향 탐지 같은 문제에서는 n은 센서 수에 해당합니다.

n = 10;

p는 행렬 BX의 열 개수입니다. 이는 p의 우변을 사용하여 시스템의 해를 동시에 구하는 것과 같습니다.

p = 1;

이 예제에서는 행렬 A의 랭크를 열 개수보다 작은 값으로 설정합니다. 빔포밍 또는 방향 탐지 같은 문제에서 rank(A)는 센서 배열에 입사하는 신호 수에 해당합니다.

rankA = 3;

precisionBits는 행렬 풀이에 필요한 정밀도 비트 수를 정의합니다. 시스템 요구 사항에 따라 이 값을 설정하십시오.

precisionBits = 32;

정규화 파라미터의 값이 작고 양수이면 문제의 조건을 개선하고 추정값 분산을 줄일 수 있습니다. 편향이 생기는 반면에, 추정값 분산이 줄어들면 최소제곱해 추정값과 비교했을 때 평균 제곱 오차가 더 작아지는 경우가 많습니다.

regularizationParameter = 0.01;

이 예제에서 복소수 값 행렬 AB는 이들 요소의 실수부와 허수부의 크기가 1보다 작거나 같도록 생성되었습니다. 따라서 모든 요소의 가능한 최대 절댓값은 |1+1i|=2입니다. 이들 값은 사용자 시스템의 요구 사항에 따라 정의합니다. 사용자가 값을 모르고 있고 시스템에서 AB를 고정소수점 입력값으로 사용한다면, upperbound 함수를 사용하여 AB의 고정소수점 데이터형의 상한을 결정할 수 있습니다.

max_abs_A는 A의 최대 크기 요소에 대한 상한입니다.

max_abs_A = sqrt(2);  

max_abs_B는 B의 최대 크기 요소에 대한 상한입니다.

max_abs_B = sqrt(2);

열 잡음 표준편차는 열 잡음 파워의 제곱근으로, 시스템 파라미터입니다. 잘 설계된 시스템의 양자화 수준은 열 잡음보다 낮습니다. 여기서 thermalNoiseStandardDeviation-50dB 잡음 파워에 상응하는 값으로 설정하십시오.

thermalNoiseStandardDeviation = sqrt(10^(-50/10))
thermalNoiseStandardDeviation = 0.0032

양자화 잡음 표준편차는 필요한 정밀도 비트 수의 함수입니다. fixed.complexQuantizationNoiseStandardDeviation 항목을 사용하여 이를 계산하십시오. 이 값이 thermalNoiseStandardDeviation보다 작은지 확인하십시오.

quantizationNoiseStandardDeviation = fixed.complexQuantizationNoiseStandardDeviation(precisionBits)
quantizationNoiseStandardDeviation = 9.5053e-11

고정소수점 데이터형 계산하기

이 예제에서는 설계된 시스템 행렬 A가 완전 랭크를 갖지 않으며(관심 신호 수가 행렬 A의 열 개수보다 작음), 측정된 시스템 행렬 A에 양자화 잡음보다 더 큰 가산성 열 잡음이 있다고 가정합니다. 이 가산성 잡음은 측정된 행렬 A가 완전 랭크를 갖도록 만듭니다.

σnoise=σthermal noise를 설정합니다.

noiseStandardDeviation = thermalNoiseStandardDeviation;

fixed.complexQRMatrixSolveFixedpointTypes 항목을 사용하여 고정소수점 데이터형을 계산합니다.

T = fixed.complexQRMatrixSolveFixedpointTypes(m,n,max_abs_A,max_abs_B,...
    precisionBits,noiseStandardDeviation,[],regularizationParameter)
T = struct with fields:
    A: [0x0 embedded.fi]
    B: [0x0 embedded.fi]
    X: [0x0 embedded.fi]

T.A[λInA]를 오버플로 없이 R=QT[λInA] 인 플레이스(in-place) 대입으로 변환하기 위해 계산된 유형입니다.

T.A
ans = 

[]

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 40
        FractionLength: 32

T.B[0n,pB]를 오버플로 없이 C=QT[0n,pB] 인 플레이스(in-place) 대입으로 변환하기 위해 계산된 유형입니다.

T.B
ans = 

[]

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 40
        FractionLength: 32

T.X는 해 X=[λInA]\[0n,pB]에 대해 계산된 유형으로, 오버플로 확률이 낮습니다.

T.X
ans = 

[]

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 44
        FractionLength: 32

지정된 유형을 사용하여 행렬 방정식 풀기

확률 행렬 AB를 생성합니다. 이때 BA의 치역 내에 있고 rankA=rank(A)가 성립되도록 합니다. 랜덤 측정 잡음을 A에 추가하여 행렬이 완전 랭크 행렬이 되게 합니다. 하지만 이렇게 하면 해도 영향을 받아서 BA 치역의 근사치가 되게 됩니다.

rng('default');
[A,B] = fixed.example.complexRandomLeastSquaresMatrices(m,n,p,rankA);
A = A + fixed.example.complexNormalRandomArray(0,noiseStandardDeviation,m,n);

입력값을 fixed.complexQRMatrixSolveFixedpointTypes에 의해 결정된 유형으로 형변환합니다. 고정소수점으로 양자화하는 것은 랜덤 잡음 [4,5]를 추가하는 것과 동일합니다.

A = cast(A,'like',T.A);
B = cast(B,'like',T.B);

fiaccel 함수로 fixed.qrMatrixSolve 함수를 가속화하여 MATLAB 실행 가능(MEX) 함수를 생성합니다.

fiaccel fixed.qrMatrixSolve -args {A,B,T.X,regularizationParameter} -o qrMatrixSolve_mex

출력 유형 T.X를 지정하고 QR 메서드를 사용하여 고정소수점 X=A\B를 계산합니다.

X = qrMatrixSolve_mex(A,B,T.X,regularizationParameter);

출력값 정확도 확인하기

고정소수점 출력값과 디폴트 배정밀도 부동소수점 값을 사용한 MATLAB 출력값 사이의 상대 오차가 작은지 확인합니다.

Xdouble=[λInA]\[0n,pB]

A_lambda = double([regularizationParameter*eye(n);A]);
B_0 = [zeros(n,p);double(B)];
X_double = A_lambda\B_0;
relativeError = norm(X_double - double(X))/norm(X_double)
relativeError = 1.1330e-05

이 파일에 mlint 경고가 표시되지 않도록 합니다.

%#ok<*NASGU>
%#ok<*ASGLU>

참고 항목

| |