File:Discrete Hilbert transforms of a cosine function, using piecewise convolution.jpg
Original file (1,108 × 576 pixels, file size: 305 KB, MIME type: image/jpeg)
Captions
Summary
[edit]DescriptionDiscrete Hilbert transforms of a cosine function, using piecewise convolution.jpg |
English: The blue graph shows a sine function that was created by computing the Discrete Hilbert transform of a cosine function. The cosine function was divided into 4 overlapping segments, which were individually convolved with an FIR Hilbert transform filter, and the 4 output segments were seamlessly pieced together. If the DFT of the FIR filter is replaced by the trivial samples of the DTFT of an IIR Hilbert transform filter, the cosine function segments are effectively convolved with a periodic summation of the IIR filter. That results in some frequency-dependent amplitude distortion and discontinuities at the segment boundaries. Examples of these effects are shown in the red graph. |
|||
Date | ||||
Source | Own work | |||
Author | Bob K | |||
Permission (Reusing this file) |
I, the copyright holder of this work, hereby publish it under the following license:
|
|||
Other versions |
Derivative works of this file: Discrete Hilbert transforms of a cosine function, using piecewise convolution.svg,
|
Scilab script
[edit]// Create a 64th-order Hilbert transform filter
M = 65;
h = hilb(M); // applies a rectangular window to the IIR function
// Derive overlap-save parameters
overlap = M-1;
N = 4*overlap; // an efficient block-size
step_size = N-overlap;
M2 = overlap/2; // length of the edge effects for a zero-phase (non-causal) filter
h = [h(1+M2:M) zeros(1,N-M) h(1:M2)]; // convert filter to zero-phase
H1 = fft(h, -1); // transfer function
H2 = %i*[0 -ones(1,N/2-1) ones(1,N/2)]; // or just sample the DTFT
// Create an input function
num_steps = 4; // signal length, in steps
n = (0 : num_steps*step_size+overlap)-M2; // sample indices (minus filter delay)
cycles_per_step = 5/3; // just a non-integer
cycles_per_sample = cycles_per_step / step_size;
x = cos(2*%pi*cycles_per_sample*n); // transform a pure sinusoid
// Overlap-Save convolution
position = 0;
while position+N <= length(x)
yt = real(fft(fft(x(position+(1:N)), -1) .* H1, 1));
y1(position+(1:step_size)) = yt(1+M2 : N-M2);
// The next 2 lines are equivalent, so the 2nd one is commented out.
yt = real(fft(fft(x(position+(1:N)), -1) .* H2, 1));
// yt = imag(hilbert(x(position+(1:N))));
y2(position+(1:step_size)) = yt(1+M2 : N-M2);
position = position + step_size;
end
// Compare the results
y1 = y1 / max(abs(y1));
y2 = y2 / max(abs(y2));
plot(y1, 'b');
plot(y2, 'r.');
title("Discrete Hilbert transforms of a cosine function, using Overlap-save algorithm", "fontsize", 4);
ylabel("amplitude", "fontsize", 3);
a = gca();
a.x_location = "origin";
a.children.children.mark_size=4; // size of red dots
File history
Click on a date/time to view the file as it appeared at that time.
Date/Time | Thumbnail | Dimensions | User | Comment | |
---|---|---|---|---|---|
current | 15:34, 29 March 2015 | 1,108 × 576 (305 KB) | Bob K (talk | contribs) | less gaudy | |
23:03, 21 March 2015 | 796 × 461 (283 KB) | Bob K (talk | contribs) | User created page with UploadWizard |
You cannot overwrite this file.
File usage on Commons
There are no pages that use this file.
Metadata
This file contains additional information such as Exif metadata which may have been added by the digital camera, scanner, or software program used to create or digitize it. If the file has been modified from its original state, some details such as the timestamp may not fully reflect those of the original file. The timestamp is only as accurate as the clock in the camera, and it may be completely wrong.
JPEG file comment | Created with GIMP |
---|