I am trying to generate a multitone signals with low crest factor and as suggested in the Boyd's paper I am using the quadratic phase distribution:

$Phase(k) = \pi(k - 1)(k - 1)/N$

where $N$ is the number of tones in the signal and $k$ their frequency indexes.

This formula works well, giving the expected crest factor ($CF <= 2$), only if the frequency indexes are strictly sequential (e.g. $k = 2,3,4,...$) but if the indexes are not sequential (e.g. $2,5,7,11,...$) or, even worst, logarithmically distributed (e.g. $1,2,4,8,...$) the resulting $CF$ is very often much higher than $2$.

I played quite a lot with the above formula, trying differ combination of $k$ and $ N$, but without any success.

What is strange, to me, is that the lowest $CF$ is always obtained by using sequential $k$ values ($k = 1,2,3,4,...$), regardless of the actual position of the frequency index.

Just to complete the story, using the Shapiro-Rudin sequence I get more or less the same behavior.

Now my question is: do you know a way to amend the above formula to get low $CF$ with any arbitrary frequency index distribution or another phase generator algorithm suitable for this scope?

Ciao and many thanks for the attention.



3 Answers 3


okay, there is a slightly newer paper by Ivo Mateljan titled Signal selection for the room acoustics measurement. i ended up reviewing the paper for the 1999 IEEE Mohonk conference, and when it turned up that Ivo was not going to make it to the conference to present the paper, they ask a reviewer to sorta stumble through the issues of the paper. i ended up talking about what's wrong with MLS more than about Ivo's technique.

if you cannot get a copy of Ivo's paper (it costs money from IEEE), email me and i will send a pdf to you. in that paper he has a section titled The Low-Crest Multisine which i paste in the text below. perhaps you can modify it to fit with your selected frequencies. i dunno.

i still haven't figured out SE's formatting to make the code look like code. someone else can edit this answer to do that.

Various algorithms were proposed for lowering the multisine crest factor. The following algorithm is slight modification of algorithms proposed in [9] and [10]. It has fast convergence and resulting multisine has good phase randomisation property.

Algorithm: Low-crest multisine (LCMS) generation.

  1. Generate uniform random sequence u of length N.

  2. Transform the sequence to random sign sequence s:

        for i = 1 : N 
            if (u(i) > 0.5) 
                s(i) = 1 
                s(i) = -1 
  3. Generate the multisine using the phase values of DFT(s).

  4. If the number of iterations is less then 10, clip the time series to 85% of the maximum value, else clip to 90% of the maximum value.

  5. Apply DFT to the clipped time series.

  6. Generate the new multisine using the phase values obtained in the step 5.

  7. Calculate the crest factor. If it is higher than objective value go to the step 4.

Although there is no proof for the convergence of this algorithm, it has never failed in a more than thousand runs with different starting seed factor. The number of iterations grows exponentially when decreasing crest factor. For a multisine sequence of length 32768 it needs only 4-5 iterations to halve the crest factor from 4 to 2, but to get the crest factor < 1.5 it needs several hundreds or more than thousand iterations.

Phase randomisation properties of this signal can be estimated by testing how it distributes nonlinear distortion in the estimated PIR. The following numerical experiment is done. The input sequence of length 4096 drives 9th order bandpass Butheworth filter (0.1-0.3 fs). The output signal is distorted with 2nd and 3rd order nonlinearities, which are equivalent to 1% of 2nd harmonic distortion and 0.7% of the 3rd harmonic distortion.

Impulse response is estimated using crosscorrelation and scaled to maximum value 1. Tables I and II show the rms and peak level of the impulse response distortion (in percentage of the maximum value). First 50 values of the impulse response are excluded from distortion calculation to better estimate peak/rms tail distortion. Also, the crest factor of the generated discrete sequence and a crest factor at the filter output are shown.

These results show that low-crest multisine generates the same level and a distribution of distortions as a true random phase multisine, regardless the crest factor value. MLS sequence generates slightly lower distortion rms level (1-1.5dB), but peak/rms ratio is much higher, especially with 2nd order distortion (10dB higher than with multisine excitation). This high peak/rms ratio disqualifies MLS as a reliable excitation signal for echo detection.

For all type of an excitation signal the crest factor at the filter output is almost the same. This is a general conclusion for narrow band systems. The benefit of using signals with lower crest factor is significant only for wideband systems, and when it is necessary to use all of the available measurement dynamic range.

RPMS is the only signal, which do not exhibit a significant crest factor transformation. This fact, constant amplitude and true random phase property fully qualify it as a periodic white noise signal.

[9] Schoukens, J., Pinelton, R., Ven der Ouderaa, E., and Renneboog, J., "Survey of Excitation Signals for FFT Based Signal Analysers", IEEE Trans. Instrumentation and Measurement, vol. 37, September 1988. [10] Ven der Ouderaa, E., Schoukens, J., and Renneboog, J., "Peak Factor Minimisation of Input and Output Signals of Linear Systems", IEEE Trans. Instrumentation and Measurement, vol. 37, June 1988.

  • $\begingroup$ First of all many thanks for your quick and kind reply. The method that you have outlined seems quite promising and now, in the next few days, I'll try to understand the Hilmar code (what language is it?) and then to translate it into C#. I would appreciate very much to get a copy of the paper that you mentioned but, being new in this forum, I couldn't find a way to email you my address: how can I do? $\endgroup$ Commented Oct 28, 2014 at 15:58
  • $\begingroup$ @FrancoLanguasco: Hilmar's code is in Matlab/Octave. $\endgroup$
    – Matt L.
    Commented Oct 29, 2014 at 10:56
  • $\begingroup$ @Matt:I was just thinking to ask for help on the Stackoverflow site when I got your comment: thank you very much! I have already downloaded a Matlab/Octave manual and I'll start the translation right away. $\endgroup$ Commented Oct 29, 2014 at 13:45
  • $\begingroup$ @ Robert: and mine is [email protected] Many thanks for your kindness and help. $\endgroup$ Commented Oct 29, 2014 at 13:54

Basically what RBJ said. Iteration can do this effectively. Below is crude (but working) example that creates a low-ish crest factor for a signal with a few hundred random frequencies and gains.

%% 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,:));
% 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));  

SOLVED, thanks to the RBJ and Hilmar suggestions.

What I do is to use the Hilmar algorithm, with two minor changes:

  • instead of using the Hilmar clipping factor (xmax = 2 * rms(x)), I use the RBJ method (from Ivo Mateljan paper) that converges faster to the target Crest Factor.

  • I then added an instruction to break the iteration loop when the last calculated CF is equal or less than the target.

But what is very, very nice with the Hilmar algorithm is the possibility to shape the signal spectrum with the "gains" coefficients.

What I actually do is to to feed this calculated signal to an "Arbitrary Wave Generator" that generates the stimulus signal for a "Vector Impedance Analyzer"; the response is then read with an A/D with only 8 bits of resolution (digital oscilloscope DSOX3024A).

If the impedance presents large modulus variations over the measurement frequency range, e.g. with series resonators, the response signal at the frequencies near to resonance is very weak and get masked within the quantization error. Now, after a first measurent with a flat spectrum stimulus, I shape the signal spectrum as the inverse of the impedance modulus obtaing, then, much better results.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.