나는 의심합니다 (편집 : 이것은 나중에 질문에서 제거되었습니다).
입력 신호가 샘플링 클록과 관련이없는 한 이러한 AM 및 PM 잡음 성분의 분포는 합리적으로 균일하다고 가정 할 수 있습니다.
신호를 고려하십시오.
신호( t ) = 코스( t ) + j 죄( t )
그리고 그 양자화 :
큐u a n t i z e d _ s i g n a l( t ) =일주( N코사인( t ) )엔+ j ×일주( N죄( t ) )엔
양자화 단계 1 / N I 및 Q 구성 요소 모두 엔= 5 당신의 그림에서).
그림 1. 신호의 트레이스 (파란색 선)와 양자화 (검은 점)와 신호의 다른 부분이 양자화되는 방식을보기 위해 이들 사이의 모핑 엔= 5. "모핑"은 단순히 일련의 추가 파라 메트릭 플롯입니다.신호( t ) + ( 1 − a ) qu a n t i z e d _ s i g n a l( t ) ...에서 a = [15,25,삼5,45] .
양자화 오류로 인한 위상 오류는 다음과 같습니다.
p h a s e _ e r r o r( t ) = 아탄( 임( qu a n t i z e d _ s i g n a l( t ) ) , 다시( qu a n t i z e d _ s i g n a l( t ) ) )− 아탄( 임( 신호( t ) ) , 다시( 신호( t ) ) )= 아탄( 라운드( N죄( t ) ) , 라운드( N코사인( t ) ) ) - 아탄( N죄( t ) , N코사인( t ) )= 아탄( 라운드( N죄( t ) ) , 라운드( N코사인( t ) ) ) - 모드( t − π, 2 π) + π
랩핑 된 단계를 빼는 것은 위험하지만이 경우에는 작동합니다.
그림 2. p h a s e _ e r r o r( t ) ...에 대한 엔= 5.
이것은 부분 선형 함수입니다. 모든 선분은 0 레벨을 교차하지만 다른 여러 레벨에서 끝납니다. 그것은 고려티 균등 한 랜덤 변수로서 p h a s e _ e r r o r( t ) ,0에 가까운 값은 과도하게 나타납니다. 그래서p h a s e _ e r r o r( t ) 균일 한 분포를 가질 수 없습니다.
실제 질문을 고려할 때 그림 1을 보면 충분히 높은 엔그리고 각각의 샘플링 간격 동안 신호가 몇 개의 양자화 경계를지나 회전하는 복소 정현파의 주파수는, 샘플에서의 양자화 에러는 사실상 수 이론의 단점으로부터 나온 의사 난수의 고정 된 시퀀스이다. 오류는 빈도와엔,또한 주파수가 샘플링 주파수의 배수의 서브 멀티플 인 경우 초기 단계에서, 양자화 에러는 모든 가능한 양자화 에러 값을 포함하지 않는 반복 시퀀스이다. 큰 한계에서엔I 및 Q 오차의 분포는 균일하고 위상 및 크기 오차는 신호 위상에 의존하는 분포에서 나오는 의사 난수입니다. 직사각형 양자화 그리드가 배향을 갖기 때문에 위상에 대한 의존성이 존재한다.
큰 한계에서 엔,위상 오차와 크기 오차는 복소수 오차의 수직 성분입니다. 크기 오차는 무한 양자화 단계에 비례하여 표현 될 수 있고, 위상 오차는아크 신양자화 단계의. 신호 단계에서α 크기 오차는 각도 방향입니다 α 위상 오류는 각도 방향입니다 α + π/ 2. 복소 양자화 오차는 I 및 Q 축을 따라 배향 된 양자화 단계 제곱에서 균일하게 분포되며, 좌표에서의 코너는 양자화 단계에 비례하여 표현된다 :
[ (1/2,1/2),( - 1 / 2 , 1 / 2 ) ,( - 1 / 2 , - 1 / 2 ) ,( 1 / 2 , - 1 / 2 ) ]
이러한 좌표의 회전 또는 비례 위상 오차 및 비례 크기 오차 축으로의 좌표 투영은 노드와 동일한 평면 상 조각 별 선형 확률 밀도 함수를 제공합니다.
[코사인( α )2−죄( α )2,코사인( α )2+죄( α )2,−코사인( α )2+죄( α )2,−코사인( α )2−죄( α )2] = [2–√코사인( α + π/ 4),2–√죄( α + π/ 4),−2–√코사인( α + π/ 4),−2–√죄( α + π/ 4) ]
그림 3. 신호 각도를 고려한 비례 위상 오차 및 비례 크기 오차의 공유 된 조각 별 선형 평면 상단 밀도 밀도 함수 (PDF)의 노드 α. 에서α ∈ { − π, − π/ 2,0,π/ 2,π}PDF는 직사각형입니다. 일부 노드는α ∈ { − 3 π/ 4,−π/ 4,π/ 4,3π/ 4} 최악의 경우가 큰 삼각형 PDF를 제공합니다.엔 1) 점근 추정치의 최대 절대 크기 오차 2–√/ 2 양자화 단계 및 2) 최대 절대 위상 오차 2–√/ 2 타임스 아크 신 양자화 단계의.
중간 단계에서 PDF는 다음과 같습니다.
그림 4. 공유 PDF α = π/ 8.
Dan이 제안한 바와 같이, PDF는 또한 크기 및 위상 오류 축에 투영 된 I 및 Q 오류 의 직사각형 PDF 의 컨볼 루션입니다 . 투영 된 PDF 중 하나의 너비는| 코사인( α ) |이고 다른 쪽의 너비는 | 죄( α ) |. 그들의 합산 분산은코사인2( α ) / 12 +죄2( α ) / 12 = 1 / 12 , 균일 α.
초기 위상과 복소 정현파 주파수와 샘플링 시퀀스의 합리적인 수 비율의 일부 "의사 운이"조합이 반복 시퀀스의 모든 샘플에 대해 작은 오차만을 제공 할 수 있습니다. 도 1에 도시 된 오차의 대칭으로 인해, 최대 절대 오차 의미에서, 그 주파수는 원에서 방문한 포인트의 수가 2의 배수 인 이점이있다. 왜냐하면 운 (낮은 오차)이 필요하기 때문이다. 포인트의 절반 만. 나머지 지점의 오류는 첫 번째 오류와 중복되며 부호가 뒤집 힙니다. 6, 4 및 12의 최소 배수는 더 큰 이점을 갖습니다. 정확한 규칙이 무엇인지 잘 모르겠습니다. 왜냐하면 규칙이 여러 개인 것에 관한 것이 아니기 때문입니다. 그것' 모듈로 산술과 결합 된 그리드 대칭에 관한 것입니다. 그럼에도 불구하고 의사 난수 오류는 결정론 적이므로 철저한 검색으로 최상의 배열을 알 수 있습니다. RMS (root-mean-square) 절대 오차 감지에서 최상의 배열을 찾는 것이 가장 쉽습니다.
그림 5. 위) 정사각 양자화 그리드를 사용하여 다양한 오실레이터 비트 깊이에 대한 복잡한 IQ 오실레이터에서 가장 낮은 RMS 절대 양자화 오류 . pseudolucky 배열에 대한 철저한 검색을위한 소스 코드는 답의 끝에 있습니다. 하단) 세부 사항, 비교를 위해 표시 (연한 파란색)엔→ ∞ RMS 절대 양자화 오차의 점근 추정 1 / 6−−−√/ N, ...에 대한 엔=2케이− 1 , 어디 k + 1 발진기 비트 수입니다.
가장 두드러진 오차 주파수의 진폭은 절대 RMS 절대 오차를 넘지 않습니다. 8 비트 발진기의 경우 특히 좋은 선택은 다음과 같습니다.12 대략 단위 원에 위치한 점 :
{ ( 0 , ± 112 ) ,( ± 112 , 0 ) ,( ± 97 , ± 56 ) ,( ± 56 , ± 97 ) }112.00297611139371
각도 순서가 증가함에 따라 복소 평면에서 이러한 점을 통과하는 이산 복합 정현파는 5 차 고조파 왜곡 만가집니다. − 91.5 답변의 끝에 옥타브 소스 코드에 의해 확인 된 기본과 비교하여 dB.
낮은 RMS 절대 양자화 오차를 얻기 위해 주파수는 대략적인 단계와 같이 순서대로 포인트를 통과 할 필요가 없습니다. [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 ] ⋅ 2 π/ 12 주파수 1 / 12샘플링 주파수를 곱한 것입니다. 예를 들어 주파수5 / 12 샘플링 주파수는 같은 포인트이지만 다른 순서로 진행됩니다. [ 0 , 5 , 10 , 3 , 8 , 1 , 6 , 11 , 4 , 9 , 2 , 7 ] ⋅ 2 π/ 12. 5와 12가 coprime 이기 때문에 이것이 작동하는 것 같습니다 .
가능한 완벽한 배열에 대해, 정현파의 주파수가 샘플링 주파수의 4 분의 1 인 경우 오차는 모든 지점에서 정확히 0이 될 수 있습니다. π/ 2샘플 당). 정사각형 그리드 에는 다른 완벽한 배열이 없습니다 . 육각형 그리드 또는 I 또는 Q 축 중 하나가삼–√ (허니컴 그리드의 두 번째 행마다 동일) π/ 3샘플 당 완벽하게 작동합니다. 이러한 스케일링은 아날로그 도메인에서 수행 될 수 있습니다. 이것은 그리드의 대칭 축의 수를 증가 시키며, 의사 운이 (pseudolucky) 배열에 주로 유리한 변화를 가져옵니다.
그림 6. 다양한 축 오실레이터 비트 깊이에 대한 복잡한 IQ 오실레이터에서 가능한 가장 낮은 RMS 절대 양자화 오류삼–√.
특히, 원에 30 개의 점이있는 8 비트 발진기의 경우 가장 작은 RMS 절대 오차는 정사각형 그리드에서 -51.3dB이고 정사각형이 아닌 사각형 그리드에서 -62.5dB이며, 가장 낮은 RMS 절대 오차 pseudolucky 시퀀스에 오류가 있습니다 :
그림 7. 길이 30의 8 비트 유사 운임 시퀀스에 의한 IQ 평면의 오차 값은 삼–√가로로. 점은 대칭 축을 중심으로 뒤집어 진 세 개의 의사 운수에서 나옵니다.
IQ 클럭 신호에 대한 실질적인 경험이 없으므로 어떤 것이 중요한지 잘 모르겠습니다. DAC (Digital-to-Analog Converter)를 사용하는 클록 신호 생성에서는 의사 유사 배열을 사용하지 않는 한 더 높은 백색 잡음 플로어를 갖는 것이 더 높은 고조파 잡음 스펙트럼을 갖는 것보다 낫습니다. 반복적 인 양자화 오류에서 발생하는 스파이크 ( 코 히어 런트 샘플링 및 양자화 노이즈 분포 참조) ). 화이트 노이즈뿐만 아니라 이러한 스펙트럼 스파이크는 기생 커패시턴스를 통해 누출 될 수 있으며 시스템의 다른 부분에 원치 않는 영향을 미치거나 장치의 전자기 호환성 (EMC)에 영향을 줄 수 있습니다. 유사하게, 확산 스펙트럼 기술은 스펙트럼 스파이크를 낮은 피크 노이즈 플로어로 전환하여 EMC를 개선합니다.
C ++에서 철저한 의사 운임 배열 검색을위한 소스 코드는 다음과 같습니다. 밤새도록 최대 16 비트 발진기에 대한 최상의 배열을 찾을 수 있습니다.1 ≤ M≤ 100.
// Compile with g++ -O3 -std-c++11
#include <stdio.h>
#include <math.h>
#include <complex>
#include <float.h>
#include <algorithm>
// N = circle size in quantization steps
const int maxN = 127;
// M = number of points on the circle
const int minM = 1;
const int maxM = 100;
const int stepM = 1;
// k = floor(log2(N))
const int mink = 2;
const double IScale = 1; // 1 or larger please, sqrt(3) is very lucky, and 1 means a square grid
typedef std::complex<double> cplx;
struct Arrangement {
int initialI;
int initialQ;
cplx fundamentalIQ;
double fundamentalIQNorm;
double cost;
};
int main() {
cplx rotation[maxM+1];
cplx fourierCoef[maxM+1];
double invSlope[maxM+1];
Arrangement bestArrangements[(maxM+1)*(int)(floor(log2(maxN))+1)];
const double maxk(floor(log2(maxN)));
const double IScaleInv = 1/IScale;
for (int M = minM; M <= maxM; M++) {
rotation[M] = cplx(cos(2*M_PI/M), sin(2*M_PI/M));
invSlope[M] = tan(M_PI/2 - 2*M_PI/M)*IScaleInv;
for (int k = 0; k <= maxk; k++) {
bestArrangements[M+(maxM+1)*k].cost = DBL_MAX;
bestArrangements[M+(maxM+1)*k].fundamentalIQNorm = 1;
}
}
for (int M = minM; M <= maxM; M += stepM) {
for (int m = 0; m < M; m++) {
fourierCoef[m] = cplx(cos(2*M_PI*m/M), -sin(2*M_PI*m/M))/(double)M;
}
for (int initialQ = 0; initialQ <= maxN; initialQ++) {
int initialI(IScale == 1? initialQ : 0);
initialI = std::max(initialI, (int)floor(invSlope[M]*initialQ));
if (initialQ == 0 && initialI == 0) {
initialI = 1;
}
for (; initialI*(int_least64_t)initialI <= (2*maxN + 1)*(int_least64_t)(2*maxN + 1)/4 - initialQ*(int_least64_t)initialQ; initialI++) {
cplx IQ(initialI*IScale, initialQ);
cplx roundedIQ(round(real(IQ)*IScaleInv)*IScale, round(imag(IQ)));
cplx fundamentalIQ(roundedIQ*fourierCoef[0].real());
for (int m = 1; m < M; m++) {
IQ *= rotation[M];
roundedIQ = cplx(round(real(IQ)*IScaleInv)*IScale, round(imag(IQ)));
fundamentalIQ += roundedIQ*fourierCoef[m];
}
IQ = fundamentalIQ;
roundedIQ = cplx(round(real(IQ)*IScaleInv)*IScale, round(imag(IQ)));
double cost = norm(roundedIQ-IQ);
for (int m = 1; m < M; m++) {
IQ *= rotation[M];
roundedIQ = cplx(round(real(IQ)*IScaleInv)*IScale, round(imag(IQ)));
cost += norm(roundedIQ-IQ);
}
double fundamentalIQNorm = norm(fundamentalIQ);
int k = std::max(floor(log2(initialI)), floor(log2(initialQ)));
// printf("(%d,%d)",k,initialI);
if (cost*bestArrangements[M+(maxM+1)*k].fundamentalIQNorm < bestArrangements[M+(maxM+1)*k].cost*fundamentalIQNorm) {
bestArrangements[M+(maxM+1)*k] = {initialI, initialQ, fundamentalIQ, fundamentalIQNorm, cost};
}
}
}
}
printf("N");
for (int k = mink; k <= maxk; k++) {
printf(",%d-bit", k+2);
}
printf("\n");
for (int M = minM; M <= maxM; M += stepM) {
printf("%d", M);
for (int k = mink; k <= maxk; k++) {
printf(",%.13f", sqrt(bestArrangements[M+(maxM+1)*k].cost/bestArrangements[M+(maxM+1)*k].fundamentalIQNorm/M));
}
printf("\n");
}
printf("bits,M,N,fundamentalI,fundamentalQ,I,Q,rms\n");
for (int M = minM; M <= maxM; M += stepM) {
for (int k = mink; k <= maxk; k++) {
printf("%d,%d,%.13f,%.13f,%.13f,%d,%d,%.13f\n", k+2, M, sqrt(bestArrangements[M+(maxM+1)*k].fundamentalIQNorm), real(bestArrangements[M+(maxM+1)*k].fundamentalIQ), imag(bestArrangements[M+(maxM+1)*k].fundamentalIQ), bestArrangements[M+(maxM+1)*k].initialI, bestArrangements[M+(maxM+1)*k].initialQ, sqrt(bestArrangements[M+(maxM+1)*k].cost/bestArrangements[M+(maxM+1)*k].fundamentalIQNorm/M));
}
}
}
다음에서 찾은 첫 번째 예제 시퀀스를 설명하는 샘플 출력 IScale = 1
:
bits,M,N,fundamentalI,fundamentalQ,I,Q,rms
8,12,112.0029761113937,112.0029761113937,0.0000000000000,112,0,0.0000265717171
다음으로 찾은 두 번째 예제 시퀀스를 설명하는 샘플 출력 IScale = sqrt(3)
:
8,30,200.2597744568315,199.1627304588310,20.9328464782995,115,21,0.0007529202390
첫 번째 예제 시퀀스를 테스트하기위한 옥타브 코드 :
x = [112+0i, 97+56i, 56+97i, 0+112i, -56+97i, -97+56i, -112+0i, -97-56i, -56-97i, 0-112i, 56-97i, 97-56i];
abs(fft(x))
20*log10(abs(fft(x)(6)))-20*log10(abs(fft(x)(2)))
두 번째 예제 시퀀스를 테스트하기위한 옥타브 코드 :
x = exp(2*pi*i*(0:29)/30)*(199.1627304588310+20.9328464782995i);
y = real(x)/sqrt(3)+imag(x)*i;
z = (round(real(y))*sqrt(3)+round(imag(y))*i)/200.2597744568315;
#Error on IQ plane
star = z-exp(2*pi*i*(0:29)/30)*(199.1627304588310+20.9328464782995i)/200.2597744568315;
scatter(real(star), imag(star));
#Magnitude of discrete Fourier transform
scatter((0:length(z)-1)*2*pi/30, 20*log10(abs(fft(z))/abs(fft(z)(2)))); ylim([-120, 0]);
#RMS error:
10*log10((sum(fft(z).*conj(fft(z)))-(fft(z)(2).*conj(fft(z)(2))))/(fft(z)(2).*conj(fft(z)(2))))