Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
H
HDL
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Jira
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
RTSD
HDL
Commits
269637cc
Commit
269637cc
authored
9 months ago
by
Eric Kooistra
Browse files
Options
Downloads
Patches
Plain Diff
Clarify input data and expected SNR.
parent
33a23650
Branches
Branches containing commit
No related tags found
1 merge request
!419
Resolve RTSD-265
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
applications/lofar2/model/pfb_bunton_annotated/reconstruct.m
+39
-15
39 additions, 15 deletions
applications/lofar2/model/pfb_bunton_annotated/reconstruct.m
with
39 additions
and
15 deletions
applications/lofar2/model/pfb_bunton_annotated/reconstruct.m
+
39
−
15
View file @
269637cc
...
...
@@ -8,37 +8,56 @@
% Correct = 1 applies the correction filter to the reconstructed signal
% outData
% John Bunton 2015
%
% Usage from README.txt:
% . first run Gen_filter12 to create prototype lowpass filter cl
% . then run reconstruct with ImpulseResponse = 1 and Correct = 1 to calculate
% an impulse response and a correction filter for the analysis PFB and
% synthesis PFB transfer function error
% . then rerun reconstruct with ImpulseResponse = 0 and Correct = 0 or 1
% . use rng('default') to check SNR results, comment rng() to experiment with
% new noise input evry rerun
close
all
% Uncomment rng() line or run rng() line first in shell, to produce same random
% numbers as with MATLAB restart, to verify the SNR results for Correct = 0, 1.
rng
(
'default'
)
ImpulseResponse
=
0
;
% set to 1 to calculate correction filter
Correct
=
1
;
% set to 1 to allow correction filter to be applied
len
=
5000
;
z
=
rand
(
len
,
1
);
z
=
z
>
0.5
;
z
=
2
*
(
z
-
0.5
);
% cl is the prototype lowpass filter
Ncoefs
=
length
(
cl
);
% = 2304
Ntaps
=
12
;
Nfft
=
Ncoefs
/
Ntaps
;
% = 192
% Input data
% 1) random block wave signal
% Create random block wave signal with block size Nhold = 16 samples, first
% insert 16-1 zeros between every sample in z. This yield length
% (len - 1) * 16 + 1. Then convolve with ones(16, 1) to replicate each value
% of z instead of the zeros. The length of conv(A, B) is length(A) +
% length(B) - 1, so length of inData becomes ((len - 1) * 16 + 1) + (16 - 1) =
% len * 16 = 80000.
len
=
5000
;
z
=
rand
(
len
,
1
);
z
=
z
>
0.5
;
z
=
2
*
(
z
-
0.5
);
clear
inData
Nhold
=
16
;
inData
(
1
:
Nhold
:
len
*
Nhold
)
=
z
;
inData
=
conv
(
inData
,
ones
(
Nhold
,
1
));
k
=
len
*
Nhold
;
% = length(inData)
k
=
length
(
inData
);
% = len * Nhold
% 2) random normal noise signal
%inData = randn(1, k); % yields similar SNR as random block wave signal
%inData = cos(((1:k).^2 ) * len / (k)^2); % comment out these two line to have random signal input
% 3) sine wave signal
%inData = cos(((1:k).^2 ) * len / (k)^2);
%inData = cos(2*pi*(1:k) * 0.031 / 16);
% 4) impulse signal
if
ImpulseResponse
==
1
inData
=
inData
.*
0
;
% for testing impulse response of system
inData
(
k
/
2
)
=
1
;
% and allows calculation of correction filter
...
...
@@ -48,7 +67,6 @@ end
Ros
=
32
/
24
;
% fix() rounds to nearest integer towards zero.
Nstep
=
fix
(
Nfft
/
Ros
);
% = 144
clf
% these is the actual analysis and synthesis operations
outBins
=
polyphase_analysis
(
inData
,
cl
,
Nfft
,
Nstep
);
...
...
@@ -78,7 +96,7 @@ corr = correct;
% Correct for time shift for transfer function correction filter
corr
(
1
+
k
:
length
(
corr
))
=
corr
(
1
:
length
(
corr
)
-
k
);
% Correct for err
r
or in transfer function
% Correct for error in transfer function
if
Correct
==
1
outData
=
ifft
(
fft
(
outData
)
.*
fft
(
fftshift
(
corr
)));
end
...
...
@@ -87,10 +105,16 @@ end
diff
=
outData
-
inData
(
1
:
length
(
outData
));
% SNR
% First do rng('default') to reset the random number generator, then
% run reconstruct. The original code by John Bunton then yields:
% First do rng('default') to reset the random number generator, then run
% reconstruct. The original code by John Bunton for the random block wave wave
% input signal then yields:
% . rng('default'); reconstruct, with Correct = 0: SNR = 30.56 dB
% . rng('default'); reconstruct, with Correct = 1: SNR = 62.24 dB
% Note:
% . With the impulse data input the SNR = 304.46 dB, so perfect.
% . For other input data there is still some error, due to the limited stopband
% attenuation of the prototype LPF (can be seen using DEVS = 0.003 instead of
% 0.0003 in Gen_filter12).
SNR
=
10
*
log10
(
sum
(
abs
(
inData
(
10000
:
70000
)
.^
2
))
/
sum
(
abs
(
diff
(
10000
:
70000
)
.^
2
)));
sprintf
(
'SNR = %6.2f [dB]'
,
SNR
)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment