# Phase noise modeling using gnuradio IIR filter

I need some advice regarding phase noise modeling using gnuradio IIR filter. I'm trying to synthesize phase noise (multiplicative) with a given noise mask. In one paper, the authors were able to synthesize the noise process for their noise mask (DVB-S2x) by filtering a WSS signal (AWGN with unity variance) with a combination of filters derived by the least square approach.
In my case, I have to use a noise mask specified by the CCSDS standards, as shown below. I'm trying to generate phase noise by means of autoregressive moving-average (ARMA) modeling. I found a couple of parametric modeling functions. I have tried the [b,a] = invfreqz(h,w,n,m) function based on the phase mask. The function generates poles and zeros and expects the impulse response vector (h), frequency vector in radians (w), number of zeros (n) and number of poles (m). I have generated the frequency vector by choosing "appropriate" frequencies from the mask and converting them to radians. The respective amplitudes were converted from dBc/hz to linear scale.

fs = 2e6; %sample rate
offset_rad = 2*pi*[1e1 1e2 1e3 1.4e3 1e4 1e5 1.1e5 1e6]/(fs);
offset_hz = offset_rad *fs /(2*pi);
lf_db = -1*[25 55 85 95 95 95 95 110];
figure
semilogx((offset_hz),lf_db)
hold on
lf_linear = 10.^(lf_db/20);
[b,a] = invfreqz(lf_linear,offset_rad,5,6)
h = freqz(b,a,offset_hz,fs);
w = offset_hz;
%freqz(b,a)
semilogx((w),20*log10(abs(h)),'r')
legend('ideal','generated')
%xlim([0 1e6])
%10*log10(w*fs/(2*pi));
figure
zplane(b,a)


The obtained response is fairly close to the expected one. The problem I'm facing now is IIR filter instability in GNU Radio. The IIR block expects feed-forward and feedback taps. These are the "b" and "a" filter taps from Matlab (direct copy/paste). The IIR filter block also has a boolean parameter called oldstyle, which is set to false. After running the flowgraph, I was able to see phase noise spectrum for less than a second before "it moves up the graph" and disappear. Inserting a number sink revealed that the output of the IIR filter goes to infinity very quickly. Why does this happen while all the poles are inside the unit circle? Any suggestions on how to generate phase noise in a more elegant way are highly welcomed too.

• From the pole-zero plot it looks like there is pole-zero canceling at $z=1$. Is that the case? If so, remove the corresponding poles and zeros, this shouldn't change the response and avoids problems. Commented Dec 18, 2018 at 17:30
• Yes. There is indeed pole-zero canceling at z = 1. Unfortunately, the $\mathit{invfreqz}$ function doesn't provide any means of moving the poles/zeros. All combinations of n and m that generate a "good" spectrum require both poles and zeros. I have tried many combinations but that pole-zero canceling at $z = 1$ never go away. Commented Dec 18, 2018 at 20:18
• OK, but you can remove those redundant poles and zeros yourself. Just compute all poles and zeros, remove the ones that cancel each other and compute the polynomial coefficients from the remaining poles and zeros. Commented Dec 18, 2018 at 20:36
• HI @MosesBrowneMwakyanjala as for alternate approaches I have used this implementation mathworks.com/matlabcentral/fileexchange/8844-phase-noise to generate time domain phase samples representing the phase noise profile, and then I injected the phase noise onto a carrier that I was creating anyway with a NCO by using the phase control word input. Caveats: the duration of the data should be 10x longer than the lowest frequency offset modeled and the update rate should be at least 3x higher than the highest offset, and even higher sufficient to bandpass filter out the images. Commented Dec 19, 2018 at 12:10