# Best choice to digitally rotate reference for an IQ filter?

I have analog GHz signal modulated with 60KHz signal and I analog mix it with reference GHz and low pass filter so now I have a 60KHz signal $$a$$ which I enthusiastically sample (at 1MHz). Meanwhile I also sample the original 60kHz modulation signal too, $$b$$. My goal is to get IQ of the 60KHz sample. I can do this with np.dot against sin(60KHz) and cos(60KHz) but.... needless to say that original 60KHz likely drifted a bit. No problem, I can np.dot the sampled 60KHz against the reference $$b$$ which gives me the inphase signal. How do I get the "Q" ? I have the both $$a$$ and $$b$$ samples available in memory so I dont have to do this on-the-fly.

My one thought is to np.roll(b) to shift the reference "by hand"(with the shift assuming perfect $$f$$ of 60KHz). But I also see that I can allpass the $$b$$ for a $$\pi/2$$ shift with effectively a Hilbert transform $$y_k = \beta^2 (x_k - y_{k-2}) + 2 \beta (y_{k-1} - x_{k-1}) + x_{k-2}$$ with a formula for $$\beta$$.... I guess I could also FFT, shift and FFT back... But I'm thinking that this is well trodden territory. Is there an industry standard practice?