- improved peak detector
git-svn-id: http://moon:8086/svn/software/trunk/projects/GnuRadio@434 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
+64
-16
@@ -25,36 +25,41 @@
|
|||||||
|
|
||||||
function retval = peak_detect ()
|
function retval = peak_detect ()
|
||||||
|
|
||||||
N = 1024
|
frames = load ('-ascii', '/home/jens/frames.dat');
|
||||||
|
[numFrames, N] = size(frames)
|
||||||
|
|
||||||
Nh = N/2;
|
Nh = N/2;
|
||||||
kn = 0.1
|
kn = 0.1
|
||||||
ks = 0.1;
|
ks = 0.5;
|
||||||
|
|
||||||
pa = 0.3;
|
pa = 0.3;
|
||||||
d_max = 30;
|
d_max = 30;
|
||||||
|
|
||||||
am = 0.1;
|
am = 0.1;
|
||||||
as = 0.9;
|
as = 0.9;
|
||||||
Ad = 10;
|
Ad = 20;
|
||||||
Cm = 1;
|
Cm = 0;
|
||||||
|
|
||||||
s = zeros(1, Nh);
|
s = zeros(1, Nh);
|
||||||
a = zeros(1, Nh);
|
a = zeros(1, Nh);
|
||||||
Xm = zeros(1, Nh);
|
Xm = -40*ones(1, Nh);
|
||||||
Xs = zeros(1, Nh);
|
Xs = zeros(1, Nh);
|
||||||
peak_count = zeros(1, Nh);
|
peak_count = zeros(1, Nh);
|
||||||
|
|
||||||
close all;
|
close all;
|
||||||
figure
|
figure
|
||||||
for k=1:128
|
|
||||||
|
|
||||||
|
for k=1:numFrames
|
||||||
% Peak generation
|
% Peak generation
|
||||||
|
|
||||||
k = fix(Nh*rand() + 1);
|
if 0
|
||||||
|
z = fix(Nh*rand() + 1);
|
||||||
|
|
||||||
if (rand() < pa)
|
if (rand() < pa)
|
||||||
if (s(k) == 0)
|
if (s(z) == 0)
|
||||||
a(k) = ks;
|
a(z) = ks;
|
||||||
s(k) = fix(d_max*rand());
|
s(z) = fix(d_max*rand());
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
x = kn*randn(1, N);
|
x = kn*randn(1, N);
|
||||||
@@ -68,18 +73,61 @@ for k=1:128
|
|||||||
X = abs(fft(x))/sqrt(N);
|
X = abs(fft(x))/sqrt(N);
|
||||||
X = X(1:Nh);
|
X = X(1:Nh);
|
||||||
X = 10*log10(X.*X);
|
X = 10*log10(X.*X);
|
||||||
|
else
|
||||||
|
X = frames(k,:);
|
||||||
|
X = X(1:Nh);
|
||||||
|
end
|
||||||
% Peak detection
|
% Peak detection
|
||||||
Xs = (1-as)*Xs + as*X;
|
Xs = (1-as)*Xs + as*X;
|
||||||
Xm_gate = Xs > (Ad+Xm);
|
gate_peak = Xs > (Ad+Xm);
|
||||||
peak_count = Xm_gate.*peak_count + Xm_gate;
|
gate_upd = Xs > (10+Xm);
|
||||||
peak = peak_count > Cm;
|
peak_count = gate_peak.*peak_count + gate_peak;
|
||||||
|
peak_cand = peak_count > 0;
|
||||||
% Update Xm at no-peak bins
|
% Update Xm at no-peak bins
|
||||||
Xm = (1-peak) .* ((1-am)*Xm + am*X) + peak.*Xm;
|
Xm = (1-gate_upd) .* ((1-am)*Xm + am*X) + gate_upd.*Xm;
|
||||||
|
|
||||||
|
% Filtering
|
||||||
|
if 0
|
||||||
|
Nhf = 21;
|
||||||
|
Ndf = (Nhf-1)/2;
|
||||||
|
hf = [ones(1, Ndf), 0, -ones(1, Ndf)];
|
||||||
|
Xf = abs(filter(hf, 1, X)/Nhf);
|
||||||
|
end
|
||||||
|
|
||||||
% Output
|
% Output
|
||||||
marker_X = find(peak ~= 0);
|
numPeaksLast = 0;
|
||||||
|
while(1)
|
||||||
|
numPeaks = 0;
|
||||||
|
for x = find(peak_cand > 0),
|
||||||
|
_x = x;
|
||||||
|
while(1)
|
||||||
|
y0 = X(_x);
|
||||||
|
xp = min(Nh, _x+1);
|
||||||
|
xn = max(1, _x-1);
|
||||||
|
if X(xp) > y0
|
||||||
|
peak_count(_x) = 0;
|
||||||
|
peak_count(xn) = 0;
|
||||||
|
_x = xp;
|
||||||
|
elseif X(xn) > y0
|
||||||
|
peak_count(_x) = 0;
|
||||||
|
peak_count(xp) = 0;
|
||||||
|
_x = xn;
|
||||||
|
else
|
||||||
|
peak_count(xn) = 0;
|
||||||
|
peak_count(xp) = 0;
|
||||||
|
numPeaks = numPeaks + 1;
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endfor
|
||||||
|
if numPeaks == numPeaksLast
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
numPeaksLast = numPeaks;
|
||||||
|
end
|
||||||
|
peak = peak_count > Cm;
|
||||||
marker_Y = X.*peak;
|
marker_Y = X.*peak;
|
||||||
|
marker_X = find(peak > 0);
|
||||||
subplot(2, 1, 1)
|
subplot(2, 1, 1)
|
||||||
plot(1:Nh, X, marker_X, marker_Y(marker_X), '+'); grid; axis([0, Nh, -60, 40]);
|
plot(1:Nh, X, marker_X, marker_Y(marker_X), '+'); grid; axis([0, Nh, -60, 40]);
|
||||||
subplot(2, 1, 2)
|
subplot(2, 1, 2)
|
||||||
|
|||||||
Reference in New Issue
Block a user