我对此有疑问(编辑:此问题后来从问题中删除了):
只要输入信号与采样时钟不相关,就可以合理地假设这些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)]
图3.给定信号角,比例相位误差和比例幅度误差的共享分段线性平顶概率密度函数(PDF)的节点。在,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之一的宽度为,另一个的宽度为。它们的组合方差为在均匀。|cos(α)||sin(α)|cos2(α)/12+sin2(α)/12=1/12,α
可能存在一些初始阶段的“假性”组合,以及复杂正弦曲线频率与采样频率的有理数比,这对于重复序列中的所有样本仅给出很小的误差。由于图1中误差的对称性,在最大绝对误差意义上,那些频率的优势在于圆上访问的点数是2的倍数,因为需要运气(低误差)只有一半的分数。其余几点的错误与第一个错误相同,并带有符号翻转。6、4和12的至少倍数具有更大的优势。我不确定确切的规则是什么,因为这似乎并不是事物的倍数。它' 关于网格对称性与模运算相结合的一些知识。然而,伪随机错误是确定性的,因此详尽的搜索显示出最佳的安排。在均方根(RMS)绝对误差意义上找到最佳排列是最容易的:
图5.顶部)使用正方形量化网格,对于各种振荡器位深度,复数IQ振荡器中的最低RMS绝对量化误差均最低。详尽的伪伪安排搜索源代码在答案的结尾。底部)细节,示出了用于比较(浅蓝色)的的RMS绝对量化误差的渐近估计,对于其中是振荡器位数。N→∞1/6−−−√/N,N=2k−1,k+1
最突出的误差频率的幅度永远不会超过RMS绝对误差。对于8位振荡器,这点大约位于单位圆上是一个特别好的选择:12
{(0,±112),(±112,0),(±97,±56),(±56,±97)}112.00297611139371
答案末尾的Octave源代码证实,离散的复杂正弦波以递增的角度顺序通过复杂平面上的这些点,仅具有5次谐波失真,与相比失真度为 dB。−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
关于可能的最佳布置,如果正弦波的频率为采样频率的四分之一(每个采样的相位增量为),则在所有点上的误差都可以恰好为零。在正方形网格上,没有其他这样的完美布置。在I轴或Q轴之一被拉伸的六边形网格或非正方形矩形网格上(因此,它等于蜂窝网格上的第二行),相位增量为每个样本的可以完美工作。这样的缩放可以在模拟域中完成。这增加了网格的对称轴的数量,这导致了对伪幸运排列的最有利的更改:√π/2 π/33–√π/3
图6.使用矩形量化网格(其中一个坐标轴由缩放),3–√对于各种振荡器位深度,在复杂IQ振荡器中,最低可能的RMS绝对量化误差。
值得注意的是,对于在圆上有30个点的8位振荡器,最小可能的RMS绝对误差在正方形网格上为-51.3 dB,在非正方形矩形网格上为-62.5 dB,其中RMS-绝对误差最低伪幸运序列有错误:
图7.长度为30的8位伪幸运序列在IQ平面上的误差值利用了在量化网格中找到的对称轴,该对称轴水平扩展了。这些点仅来自围绕对称轴翻转的三个伪幸运复数。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
示例输出描述了发现的第二个示例序列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))))