diff --git a/applications/lofar2/model/pfb_bunton/reconstruct.m b/applications/lofar2/model/pfb_bunton/reconstruct.m index ebfc15f9c30b3045f7a2861a6a21609454d4bde5..1ee4763bd8e6d145b12f290b5c36b6469a01003e 100644 --- a/applications/lofar2/model/pfb_bunton/reconstruct.m +++ b/applications/lofar2/model/pfb_bunton/reconstruct.m @@ -1,16 +1,16 @@ -%reconstruction of signal after polyphase filterbank +%reconstruction of signal after polyphase filterbank % John Bunton created Dec 2005 % % modified to add variables "Impulse Response' and "Correct" % Impulse Response = 1 calculates the impulse response of the system -% the result is in variable "recon". It also causes the transfer function +% the result is in variable "recon". It also causes the transfer function % correction filter to be calculated, Result in variable "correct" % Correct = 1 applies the correction filter to the reconstructed signal % "recon" % John Bunton 2015 ImpulseResponse = 0; % set to 1 to calculate correction filter -Correct = 0; % set to 1 to allow correction filter to be applied +Correct = 1; % set to 1 to allow correction filter to be applied len=5000; @@ -36,9 +36,9 @@ end % Set up parameters for the analysis and synthesis filterbank firlength=12; %FFT length is 1/firlength of filter length -block = length(cl)/firlength; +block = length(cl)/firlength; Oversampling_Ratio=32/24; -step = fix(length(cl)/(12*Oversampling_Ratio)); +step = fix(length(cl)/(12*Oversampling_Ratio)); clf %%%%% these is the actual analysis and synthesis operations @@ -46,9 +46,19 @@ out=polyphase_analysis(in,cl,block,step); recon=polyphase_synthesis_b(out,cl,step ); %%%%% -recon = (256*step/block)*recon; %adjust gain - - +% EK +Q = 12; % interpolation factor in Gen_filter12.m +adjust = block / Q; % normalize gain per bin for analysis LPF +adjust = adjust / Oversampling_Ratio; % compensate for oversampling factor +adjust = adjust * block / Q; % normalize gain per bin for synthesis LPF +% JB +%adjust = 256*step/block; + +sprintf('sum(cl) = %f', sum(cl)) % LPF DC gain, = 12.062337 +sprintf('adjust = %f', adjust) % gain adjust, = 192 + +recon = adjust*recon; %adjust gain + if (ImpulseResponse == 1) correct=real(ifft(1./fft(recon))); %correction filter to fix frequency response error end @@ -62,16 +72,24 @@ end k=39; corr=correct; % Correct fo time shift for transfer function correction filter -corr(1+k:length(corr))=corr(1:length(corr)-k); +corr(1+k:length(corr))=corr(1:length(corr)-k); % Correct for errror in transfer function if (Correct == 1) - recon = ifft (fft(recon).* fft(fftshift(corr))); + recon = ifft (fft(recon).* fft(fftshift(corr))); end % Take the difference to see the error diff = recon-in(1:length(recon)); +% SNR +% First do rng('default') to reset the random number generator, then +% run reconstruct. The original code by John Bunton then yields: +% . rng('default'); reconstruct, with Correct = 0: SNR = 30.56 dB +% . rng('default'); reconstruct, with Correct = 1: SNR = 62.24 dB +SNR = 10 * log10(sum(abs(in(10000:70000) .^ 2)) / sum(abs(diff(10000:70000) .^ 2))); +sprintf('SNR = %6.2f [dB]', SNR) + %plot(diff) %plot(db(fft(recon))) %to see frequency errot %plot(db(fft(diff(length(in)/8:7*length(in)/8)))) @@ -96,4 +114,4 @@ if (ImpulseResponse == 1) plot(recon) else plot(recon(1:10000),'r') -end \ No newline at end of file +end