私は疑問を持っています(編集:これは後で質問から削除されました):
これらのAMおよびPMノイズ成分の分布は、入力信号がサンプリングクロックと無相関である限り、均一であると合理的に想定できます。
信号を考えます:
およびその量子化:
signal(t)=cos(t)+jsin(t)
quantized_signal(t)=round(Ncos(t))N+j×round(Nsin(t))N
IとQの両方の成分の量子化ステップの場合(図ではです)。1/NN=5
図1.信号のトレース(青い線)とその量子化(黒い点)、および場合に信号の異なる部分が量子化される方法を確認するためのそれらのモーフィング。「モーフィング」は、追加のパラメトリックプロットのセットです atN=5asignal(t)+(1−a)quantized_signal(t)a=[15,25,35,45].
量子化誤差による位相の誤差は次のとおりです。
phase_error(t)=atan(Im(quantized_signal(t)),Re(quantized_signal(t)))−atan(Im(signal(t)),Re(signal(t)))=atan(round(Nsin(t)),round(Ncos(t)))−atan(Nsin(t),Ncos(t))=atan(round(Nsin(t)),round(Ncos(t)))−mod(t−π,2π)+π
ラップされたフェーズの減算は危険ですが、この場合は機能します。
図2のための。phase_error(t)N=5
それは区分的線形関数です。すべてのラインセグメントはゼロレベルと交差しますが、他のさまざまなレベルで終了します。つまり、を一様確率変数と見なすと、の確率密度関数ではゼロに近い値が過剰に表現されます。したがって、は一様分布を持つことができません。tphase_error(t),phase_error(t)
実際の質問を考えて、図1を見てください。十分に高いと、各サンプリング間隔中に信号がいくつかの量子化境界を超えて回転するような複雑な正弦波の周波数により、サンプルの量子化エラーは事実上、疑似ランダムの固定シーケンスです。数論の癖から来る数。エラーは、周波数と依存します。また、周波数がサンプリング周波数の倍数の約数である場合は、初期位相にも依存します。この場合、量子化エラーは、すべての可能な量子化エラー値を含まない繰り返しシーケンスです。大きなの限界NN,NIおよびQエラーの分布は均一であり、位相および振幅エラーは、信号の位相に依存する分布から生じる疑似乱数です。長方形の量子化グリッドには方向があるため、位相への依存性があります。
大きなの限界で、位相誤差と振幅誤差は、複素誤差の垂直成分です。マグニチュードエラーは、微小量子化ステップに比例して表すことができ、位相エラーは、量子化ステップのに比例して表すことができます。信号位相では、振幅誤差は角度方向あり、位相誤差は角度方向ます。複素量子化誤差は、I軸とQ軸に沿って方向付けられた量子化ステップの正方形に均一に分布し、座標の角は量子化ステップに比例して表されます。N,arcsinααα+π/2
[(1/2,1/2),(−1/2,1/2),(−1/2,−1/2),(1/2,−1/2)]
これらの座標の回転、または同等のそれらの比例位相誤差および比例等級誤差軸への投影により、ノードを持つ同じフラットトップの区分的線形確率密度関数が得られます。
[cos(α)2−sin(α)2,cos(α)2+sin(α)2,−cos(α)2+sin(α)2,−cos(α)2−sin(α)2]=[2–√cos(α+π/4),2–√sin(α+π/4),−2–√cos(α+π/4),−2–√sin(α+π/4)]
信号角所定の比例位相誤差と比例した大きさの誤差の共有区分的線形フラットトップpropability密度関数(PDF)の図3ノード、。 PDFが長方形です。一部のノードはでもマージされ、ワーストケースのラージ漸近推定を伴う三角形のPDFを生成します1)量子化ステップの最大絶対振幅誤差、および2)量子化ステップのの倍の最大絶対位相誤差。αα∈{−π,−π/2,0,π/2,π}α∈{−3π/4,−π/4,π/4,3π/4}N2–√/22–√/2arcsin
中間段階では、PDFは次のようになります。
図4.での共有PDFα=π/8.
Danによって提案されたように、PDFは、マグニチュードおよび位相エラー軸に投影されたIおよびQエラーの長方形PDFの畳み込みでもあります。投影されたPDFの1つの幅は、もう一方の幅は。それらを組み合わせた分散は均一です。|cos(α)||sin(α)|cos2(α)/12+sin2(α)/12=1/12,α
反復シーケンス内のすべてのサンプルにわずかな誤差しか与えない、初期正弦波と複素正弦波の周波数とサンプリング周波数の有理数の比率のいくつかの「疑似ラッキー」な組み合わせがあるかもしれません。図1に見られるエラーの対称性のため、最大絶対エラーの意味では、これらの周波数は、円上で訪問されるポイントの数が2の倍数であるという利点があります。ポイントの半分だけ。残りのポイントでのエラーは、最初のエラーと同じで、符号が反転します。少なくとも6、4、および12の倍数には、さらに大きな利点があります。正確なルールが何であるかはわかりません。何かの倍数であることがすべてではないようです。それ' モジュロ演算と組み合わせたグリッド対称性についての何か。それにもかかわらず、疑似ランダムエラーは確定的であるため、徹底的な検索により最適な配置が明らかになります。二乗平均平方根(RMS)絶対誤差の意味で最良の配置を見つけるのが最も簡単です。
図5.上)正方形の量子化グリッドを使用した、さまざまなオシレーターのビット深度に対する複素IQオシレーターの可能な最小のRMS絶対量子化エラー。疑似ラッキーなアレンジメントを徹底的に検索するためのソースコードは、回答の最後にあります。比較(水色)が示す底面)の詳細、 RMS絶対量子化誤差の漸近推定、のためにここで、IS発振器ビットの数。N→∞1/6−−−√/N,N=2k−1,k+1
最も顕著なエラー周波数の振幅は、RMS絶対エラーを超えることはありません。8ビットオシレータの場合、特にユニットサークル上にある次のポイントが特に適しています。12
{(0,±112),(±112,0),(±97,±56),(±56,±97)}112.00297611139371
角度の昇順で複素平面上のこれらの点を通過する離散複素正弦波は、5次の高調波歪みしかなく、基本波と比較して dBです。これは、回答の最後にあるOctaveソースコードで確認できます。−91.5
RMSの絶対量子化誤差を小さくするために、周波数は近似位相のように順番にポイントを通過する必要はありませんは、サンプリング周波数の倍の周波数です。たとえば、サンプリング周波数の倍の周波数は同じポイントを通過しますが、順序は異なります。。5と12は素数なので、これは同じように機能すると思います。[0,1,2,3,4,5,6,7,8,9,10,11]⋅2π/121/125/12[0,5,10,3,8,1,6,11,4,9,2,7]⋅2π/12
可能な完全な配置について、正弦波の周波数がサンプリング周波数の4分の1(サンプルあたり位相増分)である場合、エラーはすべての点で正確にゼロになる可能性があります。正方格子には、他にそのような完璧な配置はありません。六角形グリッド、またはIまたはQ軸の1つが係数でストレッチされた非正方形の長方形グリッド(これにより、ハニカムグリッドの2番目の行ごとに相当します)では、位相増分はサンプルあたりは完全に機能します。このようなスケーリングは、アナログドメインで実行できます。これにより、グリッドの対称軸の数が増加します。その結果、擬似ラッキーアレンジメントにほとんど好ましい変化が生じます。√π/2 π/33–√π/3
図6.スケーリングされた軸の1つ3–√を持つ長方形の量子化グリッドを使用した、さまざまなオシレータービット深度での複素IQオシレーターの可能な最小のRMS絶対量子化エラー。
特に、円上に30ポイントがある8ビットオシレータの場合、最小のRMS絶対誤差は、正方グリッドで-51.3 dB、非正方矩形グリッドで-62.5 dBであり、最小RMS絶対誤差疑似ラッキーシーケンスにエラーがあります:
図7.長さ30の8ビットの疑似ラッキーシーケンスによるIQ平面の誤差の値は、水平方向に係数で引き伸ばされた量子化グリッドにある対称軸を利用しています。点は、対称軸を中心に反転した3つの擬似ラッキー複素数から取得されます。3–√
IQクロック信号の実務経験がないので、何が重要かわからない。クロック信号生成では、デジタルアナログコンバーター(DAC)を使用して、良好な擬似ラッキー配置が使用されない限り、高調波ノイズスペクトルを高くするよりも、ホワイトノイズフロアを低くする方が良いと思います。量子化誤差の繰り返しシーケンスから生じるスパイク(コヒーレントサンプリングと量子化ノイズの分布を参照)。これらのスペクトルスパイクは、ホワイトノイズと同様に、寄生容量を介して漏れ、システムの他の部分に望ましくない影響を及ぼしたり、デバイスの電磁両立性(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
で見つかった2番目の例のシーケンスを説明する出力例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)))
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))))