Bird
Raised Fist0
SciPydata~20 mins

Spectrogram generation in SciPy - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Spectrogram Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of spectrogram shape
What is the shape of the spectrogram array generated by this code snippet?
SciPy
import numpy as np
from scipy.signal import spectrogram
fs = 1000
x = np.sin(2 * np.pi * 50 * np.linspace(0, 1, fs))
f, t, Sxx = spectrogram(x, fs)
print(Sxx.shape)
A(129, 10)
B(128, 10)
C(130, 10)
D(129, 9)
Attempts:
2 left
💡 Hint
Think about how the spectrogram divides the signal and the default window size.
❓ data_output
intermediate
1:30remaining
Spectrogram frequency bins values
Given this code, what is the first frequency bin value printed?
SciPy
import numpy as np
from scipy.signal import spectrogram
fs = 500
x = np.random.randn(fs)
f, t, Sxx = spectrogram(x, fs, nperseg=100)
print(round(f[0], 2))
A0.0
B5.0
C2.5
D50.0
Attempts:
2 left
💡 Hint
Frequency bins start from zero frequency (DC component).
❓ visualization
advanced
2:30remaining
Spectrogram visualization output
What will the color intensity represent in the spectrogram plot generated by this code?
SciPy
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import spectrogram
fs = 1000
t = np.linspace(0, 1, fs)
x = np.sin(2 * np.pi * 100 * t) + np.sin(2 * np.pi * 200 * t)
f, t, Sxx = spectrogram(x, fs)
plt.pcolormesh(t, f, 10 * np.log10(Sxx))
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.title('Spectrogram')
plt.colorbar(label='Intensity [dB]')
plt.show()
AAmplitude of the signal at each frequency and time
BRaw signal values over time
CPhase angle of the signal at each frequency and time
DPower spectral density in decibels at each frequency and time
Attempts:
2 left
💡 Hint
The plot uses 10 * log10 of Sxx values.
🔧 Debug
advanced
2:00remaining
Identify error in spectrogram call
What error will this code produce and why?
SciPy
import numpy as np
from scipy.signal import spectrogram
fs = 1000
x = np.sin(2 * np.pi * 50 * np.linspace(0, 1, fs))
f, t, Sxx = spectrogram(x, fs, nperseg=2000)
print(Sxx.shape)
AIndexError: index out of range
BTypeError: spectrogram() got an unexpected keyword argument 'nperseg'
CValueError: nperseg must not be greater than input length
DNo error, prints shape (1001, 1)
Attempts:
2 left
💡 Hint
Check the length of the input signal vs nperseg parameter.
🚀 Application
expert
3:00remaining
Detecting frequency components from spectrogram data
Given a spectrogram output Sxx and frequency array f, which code snippet correctly identifies the dominant frequency at each time slice?
SciPy
import numpy as np
from scipy.signal import spectrogram
fs = 1000
t = np.linspace(0, 1, fs)
x = np.sin(2 * np.pi * 150 * t) + np.sin(2 * np.pi * 300 * t)
f, t, Sxx = spectrogram(x, fs)
# Identify dominant frequency code here
Adominant_freqs = np.max(Sxx, axis=1)
Bdominant_freqs = f[np.argmax(Sxx, axis=0)]
Cdominant_freqs = t[np.argmax(Sxx, axis=1)]
Ddominant_freqs = f[np.argmax(Sxx, axis=1)]
Attempts:
2 left
💡 Hint
Find the frequency index with max power for each time column.

Practice

(1/5)
1. What does the scipy.signal.spectrogram function primarily compute from a signal?
easy
A. The frequency content of the signal over time
B. The total energy of the signal
C. The average amplitude of the signal
D. The phase shift of the signal

Solution

  1. Step 1: Understand the purpose of spectrogram

    A spectrogram shows how frequencies in a signal change over time, so it computes frequency content over time.
  2. Step 2: Compare with other options

    Total energy, average amplitude, and phase shift are different signal properties, not what spectrogram calculates.
  3. Final Answer:

    The frequency content of the signal over time -> Option A
  4. Quick Check:

    Spectrogram = frequency over time [OK]
Hint: Spectrogram = frequency changes over time [OK]
Common Mistakes:
  • Confusing spectrogram with total energy calculation
  • Thinking it returns average amplitude only
  • Assuming it gives phase information
2. Which of the following is the correct way to import the spectrogram function from scipy?
easy
A. from scipy import spectrogram
B. import scipy.spectrogram
C. from scipy.signal import spectrogram
D. import spectrogram from scipy.signal

Solution

  1. Step 1: Recall correct import syntax for functions

    Functions inside submodules are imported using 'from module.submodule import function'.
  2. Step 2: Check each option

    from scipy.signal import spectrogram matches this syntax exactly. Options B, C, and D are invalid Python import statements.
  3. Final Answer:

    from scipy.signal import spectrogram -> Option C
  4. Quick Check:

    Correct import syntax = from scipy.signal import spectrogram [OK]
Hint: Use 'from scipy.signal import spectrogram' [OK]
Common Mistakes:
  • Using 'import scipy.spectrogram' which is invalid
  • Trying 'from scipy import spectrogram' ignoring submodule
  • Incorrect import order like 'import spectrogram from ...'
3. What will be the shape of the frequency array returned by f, t, Sxx = spectrogram(signal, fs=1000, nperseg=256) if signal length is 1024?
medium
A. (256,)
B. (129,)
C. (512,)
D. (1024,)

Solution

  1. Step 1: Understand frequency bins from nperseg

    The frequency array length is nperseg/2 + 1 due to FFT symmetry, so 256/2 + 1 = 129.
  2. Step 2: Confirm other options

    256 is the segment length, not frequency bins. 512 and 1024 are unrelated to frequency array size here.
  3. Final Answer:

    (129,) -> Option B
  4. Quick Check:

    Frequency bins = nperseg/2 + 1 = 129 [OK]
Hint: Frequency bins = nperseg/2 + 1 [OK]
Common Mistakes:
  • Assuming frequency array length equals nperseg
  • Confusing signal length with frequency bins
  • Ignoring FFT symmetry in frequency output
4. Given this code snippet, what is the error?
from scipy.signal import spectrogram
signal = [1, 2, 3, 4, 5]
fs = 100
f, t, Sxx = spectrogram(signal, nperseg=256, fs=fs)
medium
A. nperseg is larger than signal length causing a warning or error
B. fs parameter is missing
C. spectrogram function is not imported correctly
D. signal must be a numpy array, not a list

Solution

  1. Step 1: Check parameters and signal length

    Signal length is 5, but nperseg is 256, which is larger than signal length.
  2. Step 2: Understand spectrogram behavior

    When nperseg > signal length, scipy issues a warning or error because segment size can't exceed signal length.
  3. Final Answer:

    nperseg is larger than signal length causing a warning or error -> Option A
  4. Quick Check:

    nperseg > signal length causes error [OK]
Hint: nperseg must be ≤ signal length [OK]
Common Mistakes:
  • Ignoring nperseg size relative to signal length
  • Thinking fs is missing when it is provided
  • Assuming list input causes error (it works but numpy array preferred)
5. You want to generate a spectrogram for a noisy signal sampled at 2000 Hz. To improve time resolution, which parameter should you decrease in scipy.signal.spectrogram?
hard
A. window
B. fs
C. noverlap
D. nperseg

Solution

  1. Step 1: Understand time vs frequency resolution trade-off

    Decreasing nperseg (segment length) improves time resolution but reduces frequency resolution.
  2. Step 2: Check other parameters

    fs is sample rate, noverlap controls overlap, window shapes segments but doesn't directly improve time resolution.
  3. Final Answer:

    nperseg -> Option D
  4. Quick Check:

    Decrease nperseg for better time resolution [OK]
Hint: Lower nperseg for better time resolution [OK]
Common Mistakes:
  • Trying to change fs which is fixed sample rate
  • Confusing noverlap with time resolution
  • Changing window type expecting time resolution change
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