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.