Bird
Raised Fist0
Signal Processingdata~5 mins

Pitch detection algorithm in Signal Processing

Choose your learning style10 modes available
Introduction

Pitch detection helps find the main musical note or tone in a sound. It tells us how high or low a sound is.

To tune a musical instrument by finding the note played.
To recognize spoken words by detecting voice pitch.
To analyze bird songs or animal sounds.
To create music apps that follow your singing.
To study speech patterns in language learning.
Syntax
Signal Processing
def detect_pitch(signal, sample_rate):
    # signal: audio data array
    # sample_rate: how many samples per second
    # returns: estimated pitch frequency in Hz
    pass

The function takes audio data and sample rate as input.

It returns the pitch frequency in Hertz (Hz).

Examples
Detect pitch from audio sampled at 44,100 Hz.
Signal Processing
pitch = detect_pitch(audio_data, 44100)
Detect pitch from audio sampled at 16,000 Hz, common in speech.
Signal Processing
pitch = detect_pitch(signal, 16000)
Sample Program

This program creates a 440 Hz sine wave, then uses a simple autocorrelation method to find its pitch. It prints the detected pitch and shows plots of the signal and its autocorrelation.

Signal Processing
import numpy as np
import matplotlib.pyplot as plt

def detect_pitch(signal, sample_rate):
    # Simple pitch detection using autocorrelation
    corr = np.correlate(signal, signal, mode='full')
    corr = corr[len(corr)//2:]
    d = np.diff(corr)
    start = np.where(d > 0)[0][0]  # find first positive slope
    peak = np.argmax(corr[start:]) + start
    pitch = sample_rate / peak if peak != 0 else 0
    return pitch

# Create a test signal: 440 Hz sine wave (A4 note)
fs = 8000  # sample rate
f = 440    # frequency
seconds = 1
t = np.linspace(0, seconds, int(fs*seconds), endpoint=False)
signal = 0.5 * np.sin(2 * np.pi * f * t)

pitch = detect_pitch(signal, fs)
print(f"Detected pitch: {pitch:.2f} Hz")

# Plot signal and autocorrelation for visualization
plt.subplot(2,1,1)
plt.plot(t[:200], signal[:200])
plt.title('Signal (440 Hz sine wave)')
plt.subplot(2,1,2)
corr = np.correlate(signal, signal, mode='full')
corr = corr[len(corr)//2:]
plt.plot(corr[:200])
plt.title('Autocorrelation')
plt.tight_layout()
plt.show()
OutputSuccess
Important Notes

Autocorrelation helps find repeating patterns in sound to estimate pitch.

Real-world sounds may need more advanced methods for accurate pitch detection.

Sampling rate affects pitch detection accuracy and range.

Summary

Pitch detection finds the main tone frequency in sound.

Autocorrelation is a simple way to detect pitch by finding repeating patterns.

Pitch detection is useful in music, speech, and animal sound analysis.

Practice

(1/5)
1. What is the main goal of a pitch detection algorithm in signal processing?
easy
A. To find the main frequency or tone in a sound signal
B. To remove noise from a sound signal
C. To increase the volume of a sound signal
D. To convert sound into text

Solution

  1. Step 1: Understand pitch detection purpose

    Pitch detection algorithms analyze sound to find the fundamental frequency or main tone.
  2. Step 2: Compare options to definition

    Only To find the main frequency or tone in a sound signal describes finding the main frequency, which matches pitch detection's goal.
  3. Final Answer:

    To find the main frequency or tone in a sound signal -> Option A
  4. Quick Check:

    Pitch detection = main frequency [OK]
Hint: Pitch detection finds the main tone frequency [OK]
Common Mistakes:
  • Confusing pitch detection with noise removal
  • Thinking pitch detection changes volume
  • Mixing pitch detection with speech-to-text
2. Which of the following is the correct Python syntax to compute the autocorrelation of a signal array x using numpy?
easy
A. np.autocorr(x)
B. np.correlate(x, x, mode='full')
C. np.correlation(x, x)
D. np.correlate(x)

Solution

  1. Step 1: Recall numpy autocorrelation syntax

    Autocorrelation uses np.correlate with the same array twice and mode='full' for full result.
  2. Step 2: Check options for correct function and parameters

    Only np.correlate(x, x, mode='full') uses np.correlate(x, x, mode='full'), which is correct syntax.
  3. Final Answer:

    np.correlate(x, x, mode='full') -> Option B
  4. Quick Check:

    Autocorrelation = np.correlate(x, x, 'full') [OK]
Hint: Use np.correlate(x, x, mode='full') for autocorrelation [OK]
Common Mistakes:
  • Using non-existent function np.autocorr
  • Missing second argument in np.correlate
  • Wrong function name like np.correlation
3. Given the following Python code snippet for pitch detection using autocorrelation, what is the output of pitch_period?
import numpy as np
x = np.array([0, 1, 0, -1, 0, 1, 0, -1])
correlation = np.correlate(x, x, mode='full')
mid = len(correlation) // 2
pitch_period = np.argmax(correlation[mid+1:]) + 1
print(pitch_period)
medium
A. 2
B. 3
C. 1
D. 4

Solution

  1. Step 1: Understand autocorrelation output length and midpoint

    Input length is 8, so correlation length is 15, midpoint at index 7.
  2. Step 2: Find max correlation lag after midpoint

    Correlation peaks at lag 4 (pattern repeats every 4 samples), so np.argmax(correlation[8:]) + 1 = 4.
  3. Final Answer:

    4 -> Option D
  4. Quick Check:

    Pitch period = 4 samples [OK]
Hint: Pitch period = lag with highest autocorrelation after zero lag [OK]
Common Mistakes:
  • Choosing zero lag as pitch period
  • Off-by-one error in indexing
  • Misunderstanding correlation midpoint
4. The following code attempts to find the pitch period but gives incorrect results. What is the main error?
import numpy as np
x = np.array([0, 1, 0, -1, 0, 1, 0, -1])
correlation = np.correlate(x, x, mode='full')
pitch_period = np.argmax(correlation)  # Incorrect line
print(pitch_period)
medium
A. It should use np.min instead of np.argmax
B. It uses the wrong input array for correlation
C. It finds the max correlation over full range including negative lags
D. It misses normalizing the correlation

Solution

  1. Step 1: Analyze np.argmax usage on full correlation

    Using np.argmax on full correlation finds max at zero lag (center), not pitch period lag.
  2. Step 2: Correct approach is to find max after midpoint

    Pitch period is lag > 0 with max correlation, so search only after midpoint.
  3. Final Answer:

    It finds the max correlation over full range including negative lags -> Option C
  4. Quick Check:

    Max correlation at zero lag is not pitch period [OK]
Hint: Search max correlation only after zero lag index [OK]
Common Mistakes:
  • Taking max correlation at zero lag as pitch
  • Ignoring lag indexing after midpoint
  • Confusing normalization with lag selection
5. You have a recorded audio signal sampled at 8000 Hz. Using autocorrelation, you find the pitch period is 160 samples. What is the pitch frequency in Hz? How would you calculate it?
hard
A. 50 Hz, calculated as sample_rate / pitch_period
B. 160 Hz, calculated as pitch_period / sample_rate
C. 8000 Hz, the sample rate itself
D. 0.02 Hz, calculated as pitch_period * sample_rate

Solution

  1. Step 1: Understand pitch frequency formula

    Pitch frequency = sample rate divided by pitch period (in samples).
  2. Step 2: Calculate pitch frequency

    Pitch frequency = 8000 / 160 = 50 Hz.
  3. Final Answer:

    50 Hz, calculated as sample_rate / pitch_period -> Option A
  4. Quick Check:

    Frequency = 8000 / 160 = 50 Hz [OK]
Hint: Pitch frequency = sample rate รท pitch period [OK]
Common Mistakes:
  • Dividing pitch period by sample rate instead
  • Using sample rate as frequency directly
  • Multiplying pitch period by sample rate
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard