File:DFT approximation to Hilbert filter.png

页面内容不支持其他语言。
這個文件來自維基共享資源
维基百科,自由的百科全书

DFT_approximation_to_Hilbert_filter.png(665 × 523像素,文件大小:24 KB,MIME类型:image/png


摘要

描述 The green graph is a section of the infinitely long Hilbert transform filter impulse response. The blue graph is a shorter section, produced by the Scilab function hilb() for use as an FIR filter. hilb() apparently just applies a simple rect() window, but other windows are also possible. When the filtering (convolution) is performed by multiplication of DFTs in the frequency domain (circular convolution), people sometimes replace the DFT of hilb() with samples of the DTFT (discrete-time Fourier transform) of h[n] = 2/(πn), whose real and imaginary components are all just 0 or ±1, thereby avoiding actual multiplications. But in that case, the convolution is actually being done with the periodic summation of h[n], shown in red. Unlike hilb(), it never goes to zero, which means that the "edge effects" of circular convolution affect (distort) every output sample. They can't simply be eliminated by discarding a few corrupted samples. That effect is generally worse than the distortion caused by windowing the h[n] sequence, even with the crude rectangular window. (example)
日期
来源 自己的作品
作者 Bob K
授权
(二次使用本文件)
Public domain 我,本作品著作权人,释出本作品至公有领域。这适用于全世界。
在一些国家这可能不合法;如果是这样的话,那么:
我无条件地授予任何人以任何目的使用本作品的权利,除非这些条件是法律规定所必需的。
PNG开发
InfoField
 
本PNG 位图使用LibreOffice创作。
Scripts
InfoField
Do it in two languages (for fun).

Scilab code

N = 512;        % DFT size
L = N/2;        % length of plots
odd = 1:2:L;

// Create a segment of the IIR filter and its periodic summation
  h_IIR = zeros(1,L);
  h_periodic = zeros(1,L);
  for n = odd
    h_IIR(n) = 2/(%pi*n);
    h_periodic(n) = 2/(N*tan(%pi*n/N));      % periodic summation
  end

// Equivalent method
// M = 2*L+1;         
// h_IIR = hilb(M);  //513-tap, FIR Hilbert transform filter
// h_IIR = h_IIR(L+2:M);

// Create a 65-tap, FIR Hilbert transform filter
  minimum_display_value = 0.0001;
  M = 65;         
  M2 = (M-1)/2;
// The next 2 statements are equivalent to the one commented out below them
  h_65 = hilb(M);
  h_65 = [h_65(M2+2:M) ones(1,L-M2)*minimum_display_value];   // align with h_IIR
//h_65 = [h_IIR(1:M2)  ones(1,L-M2)*minimum_display_value];   // align with h_IIR

// Create another filter (equivalent to h_periodic) by sampling the DTFT
  H_DFT = %i*[0 -ones(1,L-1) ones(1,L)];
  h_DFT = real(fft(H_DFT, 1));    // inverse FFT
  h_DFT = h_DFT(2:$);             // align with h_IIR

// Display the results
  r=5; g=3; b=2;  // based on a call to getcolor()
  plot2d(odd', [h_IIR(odd)' h_DFT(odd)' h_65(odd)'], logflag="nl", style=[g r b],..
        rect=[0,minimum_display_value,256,1], frameflag=1, axesflag=1);

  title("Hilbert filter (green) and two approximations", "fontsize", 4);
  ylabel("impulse response (for n > 0)", "fontsize", 3);
  xlabel("n (odd values only)", "fontsize", 3);

  a = gca();
//a.box = "on";         included in frameflag=1
  a.font_size=3;        //set the tics label font size
  a.x_ticks = tlist(["ticks", "locations", "labels"], [1 51 101 151 201 251],..
  ["1" "51" "101" "151" "201" "251"]);

// Set line thickness of plots
  a.children.children.thickness=3;

// This works too
//f = gcf();
//f.children.children.children.thickness=3;

// Can do it this way when the thicknesses are not all the same:
// pb = a.children.children(1);    // Note that the order (compared to "style") is LIFO
// pr = a.children.children(2);
// pg = a.children.children(3);
// pg.thickness = 3;
// pr.thickness = 3;       // equivalent to set(pr,'thickness',3);
// pb.thickness = 3;

Now do it in Octave.

Octave code

pkg load signal
  N = 512;        % DFT size
  L = N/2;        % length of plots
  odd = 1:2:L;

% Create a segment of the IIR filter and its periodic summation
  h_IIR = zeros(1,L);
  h_periodic = zeros(1,L);
  for n = odd
    h_IIR(n) = 2/(pi*n);
    h_periodic(n) = 2/(N*tan(pi*n/N));      % periodic summation
  endfor

% Create a 65-tap, FIR Hilbert transform filter
  minimum_display_value = 0.0001;
  M = 65;         
  M2 = (M-1)/2;
  h_65 = [h_IIR(1:M2)  ones(1,L-M2)*minimum_display_value];   % align with h_IIR

% Create another filter (equivalent to h_periodic) by sampling the DTFT
  H_DFT = i*[0 -ones(1,L-1) ones(1,L)];
  h_DFT = real(ifft(H_DFT));        % inverse FFT
  h_DFT = h_DFT(2:end);             % align with h_IIR

% Display the results
  figure
  semilogy(odd', h_IIR(odd)', 'color', 'green', 'linewidth', 2)
  hold on
% The next two statements are eqivalent
  semilogy(odd', h_DFT(odd)', 'color', 'red', 'linewidth', 2)
% semilogy(odd', h_periodic(odd)', 'color', 'red', 'linewidth', 2)

  semilogy(odd', h_65(odd)', 'color', 'blue', 'linewidth', 2)

  xlim([0 256])
  ylim([minimum_display_value 1])
  set(gca, 'xtick', [1:50:251]);

  title("Hilbert filter (green) and two approximations", "fontsize", 14);
  ylabel("impulse response (for n > 0)", "fontsize", 12);
  xlabel("n (odd values only)", "fontsize", 12);

LaTex


La bildo estas kopiita de wikipedia:en. La originala priskribo estas (The image is copied from wikipedia: en. The original description is):

date/time username edit summary source
23:55, 7 December 2005 en:User:Bob K (I created this image myself, using Matlab tools.) http://en.wikipedia.org/wiki/Image:DFT_approximation_to_Hilbert_filter.png

en:Image:DFT approximation to Hilbert filter.png

说明

添加一行文字以描述该文件所表现的内容

此文件中描述的项目

描繪內容

文件历史

点击某个日期/时间查看对应时刻的文件。

日期/时间缩⁠略⁠图大小用户备注
当前2015年3月28日 (六) 20:522015年3月28日 (六) 20:52版本的缩略图665 × 523(24 KB)Bob KThis one depicts the truncated part of the FIR filter as on the x-axis, which is slightly above zero. The actual value of the truncated part is exactly zero., of course.
2015年3月28日 (六) 20:272015年3月28日 (六) 20:27版本的缩略图659 × 518(24 KB)Bob KImprovements to the script caused some minor changes to the figure.
2015年3月28日 (六) 02:372015年3月28日 (六) 02:37版本的缩略图587 × 559(27 KB)Bob KAdd periodic summation formulation of the DFT approximation. Also, overlay an FIR approximation computed with the Scilab hilb() function. Surprisingly, it appears to be just a truncated version of the IIR function, with no windowing.
2007年9月28日 (五) 00:492007年9月28日 (五) 00:49版本的缩略图560 × 420(6 KB)Bob K{{Information |Description= approximation error when Hilbert transform is implemented in frequency domain |Source=self-made |Date=27-Sep-2007 |Author= Bob K }}
2006年3月18日 (六) 21:042006年3月18日 (六) 21:04版本的缩略图546 × 409(6 KB)MaksimLa bildo estas kopiita de wikipedia:en. La originala priskribo estas: == Summary == I created this image myself, using Matlab tools. == Licensing == {{PD-self}} {| border="1" ! date/time || username || edit summary |---- | 23:55, 7 December 2005 || [[:e

以下页面使用本文件:

全域文件用途

以下其他wiki使用此文件:

元数据