Frequency doubling of a signal with noise and without

I've been given a task to simulate a real-world scenario, in which a system receives a signal with a carrier frequency of 3.75 MHz. To filter the signal, either a very sharp and resource-intensive filter can be used, or a proposed series of frequency doubling and filtration of the signal that supposedly improves the SNR while being much less heavy on processing power.

The idea is to receive a signal with a sampling rate of 100 MSa/s and wide-band white noise (BW = 50 MHz). Perform initial filtration with a BW of 2 MHz, then perform an absolute operation on the signal. This will double the signal's frequency with added distortion. Pass this frequency doubled signal through another BPF to clear the distortion. Repeat this 2 more times. Total number of stages is 4, starting frequency is 3.75 MHz and final frequency is 30 MHz with a BW = ~ 1 MHz. Each filter stage has a multiplier constant which is set by hand, to bring the signal back to full-scale level, since while the frequency is doubled, the amplitude is halved.

Now the conundrum is that when pure noise enters the system at full-scale level (-1 to 1), the total noise level at the output of the final filter is reduced. Together with the reduced bandwidth, the total noise improves by 13 dB. However, when a signal is mixed together with the noise - for example 0.5signal + 0.5noise (which equals to an SNR of 10 dB after the first filter), while the final signal power barely degrades (due to the multiplication at each stage), the total noise power rises significantly, which degrades the total SNR by close to 8 dB.

I've tried several options to calculate SNR - either calculate total noise power in a given bandwidth by the average noise power in the BW of the filter, or by adding a counter-signal at the carrier (or 2f, 4f etc) frequency, to remove the tone signal after each filter and leave just the noise. Then, calculating the RMS of the counter-signal and the STD of the noise will give the SNR of the stage. Neither way supports the initial statement that this process improves the SNR.

Here's the code I have used (MATLAB):

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%% Sampling rate and carrier frequencies %%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Fs = 100e6;
fc = 3.75e6;
t = (0:(10000-1))*1/Fs;

sig.org = sin(2*pi*fc*t)';

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%% Noise Gen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

sig.noise = wgn(length(sig.org), 1, -6);
sig.noise = normalize(sig.noise, 'range',[-0.99 0.99]);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%% Sig and Noise Mixing %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

sig.orgAWG = 0.5*sig.org + 0.5*sig.noise;

%% Filter Stages

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Stage 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sig.orgF = filtfilt(filt.STG1.Numerator, 1, sig.orgAWG);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AGC %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Cmin = abs(min(sig.orgF));
Cmax = max(sig.orgF);
if Cmin > Cmax
sig.orgF = (0.95/Cmin).*sig.orgF;
else
sig.orgF = (0.95/Cmax).*sig.orgF;
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Stage 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

sig.D1A = abs(sig.orgF);
sig.D1F = filtfilt(filt.STG2.Numerator, 1, sig.D1A);
sig.D1F = 2.4991.*sig.D1F;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Stage 3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

sig.D2A = abs(sig.D1F);
sig.D2F = filtfilt(filt.STG3.Numerator, 1, sig.D2A);
sig.D2F = 2.3845.*sig.D2F;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Stage 4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

sig.D3A = abs(sig.D2F);
sig.D3F = filtfilt(filt.STG4.Numerator, 1, sig.D3A);
sig.D3F = 2.3015.*sig.D3F;



Here's an example on an FFT performed with pure full-scale noise at the input, with both the first stage and last stage outputs. Seemingly, the total noise level and the bandwidth of the noise are reduced, therefore the total SNR should go up.

Here's an FFT performed on a pure full-scale signal at the input of the system, no noise:

So, given that in superposition, with pure signal, the power of the signal doesn't degrade, and with pure noise the power of the noise does go down for a significant improvement, why when two of these are combined the total SNR degrades?

And here is an example when the total input is 0.5noise + 0.5signal. The signal power is not degraded, but even though the bandwidth of the noise is reduced, the power is increased by ~10 dB

• what is the purpose of all this? repeated squaring destroys the data on a carrier, so I'm not sure what the point of this is? Commented Mar 19 at 20:56
• Egor, did I answer your question or do you need more details? Commented Mar 23 at 15:32

When the carrier and noise are combined, the otherwise noise free carrier will now have a significant phase noise component. When you double the frequency, you also double the phase resulting in a 6 dB increase in phase noise. In general for any frequency multiplier by $$N$$, the phase noise will increase by $$20log_{10}(N)$$.