## 7-7 Preprocessing: Clipping

Here we shall cover some of the preprocessing techniques that have been proposed to "purify" the signals before pitch tracking. These techniques are seemingly intuitive, but it is still advisable to test these techniques with labeled dataset before using them. These techniques include:

• Pre-filter the signals
• Clip the signals
• SIFT method

Since human's pitch is usually within the range of $[40, 1000]$ Hz, therefore it is a common practice to pass the signals through a low-pass filter in order to remove high-frequency components which are believed to be detrimental to pitch tracking. Usually the cutoff frequency of the low-pass filter is set to 800 to 1000 Hz.

In order to remove noise around zero of the original frame, we can apply center clipping before computing ACF or AMDF. Some of the commonly used techniques for center clipping are displayed in the following figure:

In particular, for pitch tracking over low-end processors (microcontrollers, for instance), it is possible to pass the signal through a binary or ternary sign function such that the further computation of ACF or AMDF can be performed much faster.

Â²³æ¦a»¡¡A§Ú­Ì¬O±N¤@­Ó­µ®Ø¤¤ªº°T¸¹ $s(i), i=1,\dots,n$ ªí¥Ü¦¨¤§«e°T¸¹ªº½u©Ê²Õ¦X¡G $$s(n) = a_1 s(n-1) + a_2 s(n-2) + \cdots + a_m s(n-m) + e(n)$$ ¨Ã§Q¥Î³Ì¤p¥­¤èªk¨Ó§ä¥X³Ì¨Îªº $\{a_1, a_2, \dots , a_m\}$¡A¨Ï±o $\sum e^2(n)$ ¬°³Ì¤p¡A¦¹ $s(n)$ §Y¬O©Ò¿×ªº excitation signal ¡]­ì©l¿Eµo°T¸¹¡^¡A¦A¥Î¦¹ $s(n)$ ¨Ó¶i¦æ ACF¡A±o¨ìªº®ÄªG¸û¦n¡C

¦b¥H¤Uªº½d¨Ò¤¤¡A§Ú­Ì¨Ï¥Î¤@­Ó m ¬° 20 ªº LPC (linear predictive coefficients) ¨Ó¶i¦æ SIFT:

Example 1: siftAcf01.mwaveFile = 'soo.wav'; au=myAudioRead(waveFile); startIndex=15000; frameSize=256; endIndex=startIndex+frameSize-1; frame=au.signal(startIndex:endIndex); opt=frame2pdf('defaultOpt'); opt.maxShift=length(frame); opt.useShift=0; acf0=frame2pdf(frame, opt); opt.useSift=1; [acf1, frameEstimated, excitation]=frame2pdf(frame, opt); subplot(3,1,1) plot(1:frameSize, [frame, frameEstimated]); legend('Original Signal', 'LPC estimate'); title('Original signal vs. LPC estimate'); subplot(3,1,2); plot(1:frameSize, excitation); grid on title(['Residual signal when order = ', int2str(opt.siftOrder)]); subplot(3,1,3); plot(1:frameSize, [acf0/max(acf0), acf1/max(acf1)]); grid on title('Normalized ACF curves'); xlabel('Frame index'); legend('Normalized ACF on original frame', 'Normalized ACF on excitation');