
Plotting a peak envelope
23 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Camill Trüeb
il 11 Lug 2016
Modificato: Greg Dionne
il 12 Lug 2016
I have measured the swinging off of a resonant circuit with a oscilloscope. Now I'm trying to fit a peak envelope over this data. Therefore I've tried:
figure
plot(temp(:,1), smooth(temp(:,2),30))
hold on
plot(temp(:,1), smooth(abs(hilbert(temp(:,2))),190))
I still get a slightly oscillating function, instead of a constantly decreasing function. How can I improve the envelope function? Would really appreciate help. My solution is shown in the image. Cheers

P.s.: For the argument of smooth(x,y) I iteratively worked out optimal values
0 Commenti
Risposta accettata
Star Strider
il 11 Lug 2016
Modificato: Star Strider
il 12 Lug 2016
I don’t have your signal, so I can’t provide definitive code.
First, do a fft of your signal so you have an idea of the frequency content.
Second, experiment with the envelope function (or its equivalent, the hilbert call you’ve already used) but without the smooth call:
y = abs(hilbert(temp(:,2)));
You may have to adjust the parameters of the hilbert function.
Another possibility is to use a bandpass filter, and just experiment with the passbands until your get the result you want. Use the results of the fft call for your design. The objective is to pass only the low-frequency envelope of the function.
-----------------------------------------------------------
EDIT —
This isn’t perfect, but it’s the best I can do:
[d,s,r] = xlsread('Camill Trüeb F0002CH1.csv', 'E1:E2500');
Ts = 4E-10;
Fs = 1/Ts;
Fn = Fs/2;
tv = (0:length(d)-1)*Ts;
st = find(d > 0.1, 1, 'first');
d = d(st:end);
tv = tv(st:end);
L = length(d);
[pks, locs] = findpeaks(abs(d), tv, 'MinPeakDist',1E-7);
q = [locs' ones(size(locs'))]\log(abs(pks)); % Initial Parameter Estimaes
fitfcn = @(b,t) b(1) .* exp(b(2).*t) + b(3); % Fit Function
SSECF = @(b) sum((pks - fitfcn(b,locs')).^2); % Cost Function
[B,SSE] = fminsearch(SSECF, [pks(1); q(1); 0]);
figure(5)
plot(tv, d)
hold on
plot(tv, fitfcn(B,tv))
hold off
grid

2 Commenti
Più risposte (2)
Greg Dionne
il 11 Lug 2016
Modificato: Greg Dionne
il 12 Lug 2016
If you have HILBERT then you have access to the Signal Processing Toolbox. If you have R2015b or later, try using ENVELOPE:
[d,s,r] = xlsread('F0002CH1.csv', 'E1:E2500')
%zoom in on decaying portion
envelope(d(580:end),500,'analytic')

2 Commenti
Greg Dionne
il 12 Lug 2016
It should be in 16a.
cd ([matlabroot '/toolbox/signal/signal'])
edit envelope
Hopefully it'll be there.
Vedere anche
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!