Power spectral density (PSD) estimation helps us understand how the power of a signal is spread across different frequencies. It shows which frequencies carry the most energy.
Power spectral density estimation in Signal Processing
frequencies, psd_values = signal.welch(signal_data, fs=sampling_rate, nperseg=segment_length)
signal_data is your input signal array.
fs is the sampling rate (how many samples per second).
nperseg is the length of each segment used for estimation.
data sampled at 1000 Hz with default segment length.frequencies, psd = signal.welch(data, fs=1000)frequencies, psd = signal.welch(data, fs=500, nperseg=256)
frequencies, psd = signal.welch(data, fs=2000, nperseg=512, window='hann')
This program creates a signal with two sine waves at 50 Hz and 120 Hz plus some noise. It then estimates the power spectral density using Welch's method and prints the first few frequency and PSD values. Finally, it plots the PSD on a logarithmic scale to show the power distribution across frequencies.
import numpy as np from scipy import signal import matplotlib.pyplot as plt # Create a sample signal: 2 sine waves + noise fs = 1000 # Sampling frequency 1000 Hz T = 1.0 # seconds N = int(T * fs) # Number of samples t = np.linspace(0, T, N, endpoint=False) sig = 0.5 * np.sin(2 * np.pi * 50 * t) + 0.3 * np.sin(2 * np.pi * 120 * t) sig += 0.1 * np.random.normal(size=N) # Add noise # Estimate power spectral density frequencies, psd = signal.welch(sig, fs=fs, nperseg=256) # Print first 5 frequency and PSD values for f, p in zip(frequencies[:5], psd[:5]): print(f"Frequency: {f:.3f} Hz, PSD: {p:.6f}") # Plot PSD plt.semilogy(frequencies, psd) plt.title('Power Spectral Density Estimation') plt.xlabel('Frequency (Hz)') plt.ylabel('PSD (V**2/Hz)') plt.grid(True) plt.show()
Welch's method splits the signal into overlapping segments to get a smoother PSD estimate.
Choosing segment length (nperseg) affects frequency resolution and variance of the estimate.
Window functions like Hann reduce spectral leakage but change the PSD shape slightly.
Power spectral density shows how signal power spreads over frequencies.
Welch's method is a common way to estimate PSD by averaging segments.
Adjust sampling rate and segment length to get better frequency details.
Practice
Solution
Step 1: Understand the definition of PSD
PSD shows how the power of a signal is spread across frequencies, not just total energy or amplitude.Step 2: Compare options with PSD meaning
Only How the power of a signal is distributed over different frequencies correctly describes PSD as power distribution over frequencies.Final Answer:
How the power of a signal is distributed over different frequencies -> Option AQuick Check:
PSD = power distribution over frequency [OK]
- Confusing PSD with total signal energy
- Thinking PSD shows signal amplitude at a time
- Mixing PSD with phase information
Solution
Step 1: Identify Welch's method function
Welch's method for PSD estimation is implemented in scipy.signal.welch().Step 2: Differentiate from other functions
fft() computes Fourier transform, correlate() computes correlation, spectrogram() shows time-frequency but not PSD by Welch.Final Answer:
scipy.signal.welch() -> Option DQuick Check:
Welch PSD = scipy.signal.welch() [OK]
- Using fft() instead of welch() for PSD
- Confusing spectrogram with PSD estimation
- Trying correlate() for PSD calculation
f returned by scipy.signal.welch?
import numpy as np from scipy.signal import welch fs = 1000 # Sampling frequency x = np.random.randn(1024) # Random signal f, Pxx = welch(x, fs=fs, nperseg=256)
Solution
Step 1: Understand nperseg effect on frequency bins
Welch returns frequency bins of length nperseg/2 + 1 for real signals.Step 2: Calculate frequency array length
nperseg=256, so length = 256/2 + 1 = 129.Final Answer:
129 -> Option BQuick Check:
Frequency bins = nperseg/2 + 1 = 129 [OK]
- Assuming frequency length equals nperseg
- Using full signal length instead of segment length
- Confusing frequency bins with time samples
import numpy as np from scipy.signal import welch fs = 500 x = np.sin(2 * np.pi * 50 * np.arange(1000) / fs) f, Pxx = welch(x, fs=fs, nperseg=2000)
Solution
Step 1: Check nperseg vs signal length
nperseg=2000 is greater than signal length 1000, which causes a warning or error.Step 2: Verify other parameters
fs=500 is valid, x is numpy array, window parameter is optional with default.Final Answer:
nperseg is larger than the signal length -> Option CQuick Check:
nperseg > signal length causes error [OK]
- Setting nperseg larger than signal length
- Assuming window parameter is mandatory
- Confusing sampling frequency with segment length
Solution
Step 1: Understand effect of segment length and overlap
Longer segments improve frequency resolution; overlapping segments reduce variance (smoother PSD).Step 2: Evaluate options for smoothing and resolution
Increase segment length (nperseg) and use overlapping segments correctly suggests increasing nperseg and using overlap; others reduce resolution or are impractical.Final Answer:
Increase segment length (nperseg) and use overlapping segments -> Option AQuick Check:
Longer segments + overlap = smoother, better PSD [OK]
- Using very short segments losing frequency detail
- Ignoring overlap reduces averaging benefits
- Thinking sampling rate increase smooths PSD
Ready to prove it?
Pass the test and this pattern moves unknown
