import numpy as np from scipy.fft import fft, fftfreq sample_rate = 200.0 duration = 1.0 sample_count = int(sample_rate * duration) time = np.arange(sample_count) / sample_rate signal = ( 1.2 * np.sin(2.0 * np.pi * 30.0 * time) + 0.4 * np.sin(2.0 * np.pi * 75.0 * time) ) spectrum = fft(signal) frequencies = fftfreq(sample_count, d=1.0 / sample_rate) positive = frequencies >= 0 positive_frequencies = frequencies[positive] amplitudes = (2.0 / sample_count) * np.abs(spectrum[positive]) peak_indexes = np.flatnonzero(amplitudes > 0.1) detected_peaks = positive_frequencies[peak_indexes] expected_peaks = np.array([30.0, 75.0]) print(f"sample_count: {sample_count}") print(f"bin_spacing_hz: {sample_rate / sample_count:.1f}") print("detected peaks:") for index in peak_indexes: print(f" {positive_frequencies[index]:5.1f} Hz amplitude {amplitudes[index]:.3f}") print(f"dominant_frequency_hz: {positive_frequencies[np.argmax(amplitudes)]:.1f}") print(f"matches_expected_peaks: {np.allclose(detected_peaks, expected_peaks)}")