具有低波峰因数的多音信号
好的,Ivo Mateljan 有一篇稍新的论文,题为Signal selection for the room acoustics measurement。我最终为 1999 年的 IEEE Mohonk 会议审阅了这篇论文,当发现 Ivo 不会参加会议发表论文时,他们要求审稿人偶然发现论文的问题。我最终谈论的是 MLS 的问题,而不是 Ivo 的技术。
如果您无法获得 Ivo 论文的副本(它需要 IEEE 的费用),请给我发电子邮件,我会发送 pdf 给您。在那篇论文中,他有一个标题为The Low-Crest Multisine的部分,我将其粘贴在下面的文本中。也许您可以修改它以适合您选择的频率。我不知道。
我还没有弄清楚 SE 的格式以使代码看起来像代码。其他人可以编辑此答案来做到这一点。
提出了各种算法来降低多正弦波峰因数。以下算法是对 [9] 和 [10] 中提出的算法的轻微修改。它具有快速收敛性,得到的多正弦具有良好的相位随机化特性。
算法:低波峰多正弦 (LCMS) 生成。
u
生成长度为 的均匀随机序列N
。将序列转换为随机符号序列
s
:for i = 1 : N if (u(i) > 0.5) s(i) = 1 else s(i) = -1 end
使用 DFT(s) 的相位值生成多正弦。
如果迭代次数小于 10,则将时间序列裁剪为最大值的 85%,否则裁剪为最大值的 90%。
将 DFT 应用于裁剪的时间序列。
使用在步骤 5 中获得的相位值生成新的多正弦。
计算波峰因数。如果高于目标值,则转到步骤 4。
虽然没有证据证明该算法的收敛性,但它在不同起始种子因子的数千次运行中从未失败过。当波峰因数减小时,迭代次数呈指数增长。对于长度为 32768 的多正弦序列,只需 4-5 次迭代即可将波峰因数从 4 减半到 2,但要使波峰因数 < 1.5,它需要数百或数千次迭代。
可以通过测试它如何在估计的 PIR 中分布非线性失真来估计该信号的相位随机化特性。进行以下数值实验。长度为 4096 的输入序列驱动 9 阶带通布特沃斯滤波器 (0.1-0.3 fs)。输出信号具有 2 阶和 3 阶非线性失真,相当于 1% 的 2 次谐波失真和 0.7% 的 3 次谐波失真。
使用互相关估计脉冲响应并缩放到最大值 1。表 I 和表 II 显示了脉冲响应失真的 rms 和峰值电平(以最大值的百分比表示)。脉冲响应的前 50 个值被排除在失真计算之外,以更好地估计峰值/rms 尾部失真。此外,还显示了生成的离散序列的波峰因数和滤波器输出的波峰因数。
这些结果表明,无论波峰因数值如何,低波峰多正弦波都会产生与真正的随机相位多正弦波相同的电平和失真分布。MLS 序列产生的失真 rms 水平略低(1-1.5dB),但峰值/rms 比要高得多,尤其是二阶失真(比多正弦激励高 10dB)。这种高峰值/rms 比使 MLS 无法作为用于回波检测的可靠激励信号。
对于所有类型的激励信号,滤波器输出的波峰因数几乎相同。这是窄带系统的一般结论。仅当宽带系统需要使用所有可用的测量动态范围时,使用具有较低波峰因数的信号的好处才显着。
RPMS 是唯一没有表现出显着波峰因数变换的信号。事实上,恒定幅度和真正的随机相位特性使其完全符合周期性白噪声信号的要求。
[9] Schoukens, J.、Pinelton, R.、Ven der Ouderaa, E. 和 Renneboog, J.,“基于 FFT 的信号分析器的激励信号调查”,IEEE Trans。仪器仪表和测量,第一卷。37,1988 年 9 月。 [10] Ven der Ouderaa, E.、Schoukens, J. 和 Renneboog, J.,“线性系统的输入和输出信号的峰值因子最小化”,IEEE Trans。仪器仪表和测量,第一卷。37,1988 年 6 月。
基本上就是RBJ所说的。迭代可以有效地做到这一点。下面是粗略的(但有效的)示例,它为具有数百个随机频率和增益的信号创建了一个较低的波峰因数。
%% script to do a mutlitone low crest factor noise signal
nx = 8192; % fft grid
nf = 200; % number of frequencies
% create a random set of frequencies and gains
ifr = round(nx/2*rand(nf,1))+1;
% gains from -10dB to 0 dB
gains = 10.^(.05*(-10 + 10*rand(nf,1)));
% initialize
phi = 2*pi*rand(nf,1); % random phase
fx0 = zeros(nx/2+1,1);
fx = fx0;
fx(ifr,:) = gains.*exp(1i*phi);
fx0(ifr,:) = gains;
%% main iteration loop
numIter = 1000;
for i = 1:numIter
% make conjugate symmetric
fx1 = [fx; conj(fx(end-1:-1:2))];
% time domain
x = ifft(fx1);
% clip at a target crest factor of 2
xmax = 2*rms(x);
x( x > xmax)= xmax;
x( x < -xmax) = -xmax;
% go back to frequency domain
fx1 = fft(x);
% transfer phase
fx(ifr,:) = gains.*fx1(ifr,:)./abs(fx1(ifr,:));
end
% final time domain signal
fx1 = [fx; conj(fx(end-1:-1:2))];
% time domain
x = ifft(fx1);
fprintf('final crest factor = %f\n', max(abs(x))./rms(x));
已解决,感谢 RBJ 和 Hilmar 的建议。
我所做的是使用 Hilmar 算法,有两个小改动:
我没有使用 Hilmar 削波因子 (xmax = 2 * rms(x)),而是使用更快收敛到目标波峰因子的 RBJ 方法(来自 Ivo Mateljan 论文)。
然后,我添加了一条指令,以在最后计算的 CF 等于或小于目标时中断迭代循环。
但是,Hilmar 算法非常非常好的地方是可以使用“增益”系数来塑造信号频谱。
我实际上所做的是将这个计算得到的信号馈送到“任意波发生器”,该发生器为“矢量阻抗分析仪”生成刺激信号;然后使用分辨率仅为 8 位的 A/D 读取响应(数字示波器 DSOX3024A)。
如果阻抗在测量频率范围内呈现出较大的模量变化,例如使用串联谐振器,则接近谐振频率处的响应信号非常微弱,并被量化误差所掩盖。现在,在使用平坦频谱刺激进行第一次测量后,我将信号频谱整形为阻抗模量的倒数,从而获得更好的结果。