To address your challenge of finding a single peak and valley in a noisy signal, you can try using a smoothing technique to reduce noise before detecting peaks and valleys. Here's an approach using Python and the SciPy library:
-
Smooth the Data: Use a moving average or a Savitzky-Golay filter to smooth the noisy signal.
-
Find Peaks and Valleys: Use the
find_peaksfunction from thescipy.signalmodule with appropriate parameters.
Here's an example of how to do this:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.signal import find_peaks, savgol_filter
# Load your data
data = pd.read_csv('path_to_your_data.csv', header=None)
x = data[0]
y = data[1]
# Smooth the data using Savitzky-Golay filter
window_size = 51 # Choose an appropriate window size
poly_order = 3 # Polynomial order
y_smooth = savgol_filter(y, window_size, poly_order)
# Find peaks
peaks, _ = find_peaks(y_smooth, distance=50) # Adjust 'distance' as needed
# Find valleys (by finding peaks in the inverted signal)
valleys, _ = find_peaks(-y_smooth, distance=50) # Adjust 'distance' as needed
# Plot the results
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='Original Signal')
plt.plot(x, y_smooth, label='Smoothed Signal')
plt.plot(x[peaks], y_smooth[peaks], 'ro', label='Peaks')
plt.plot(x[valleys], y_smooth[valleys], 'go', label='Valleys')
plt.legend()
plt.xlabel('Time')
plt.ylabel('Signal')
plt.title('Peak and Valley Detection')
plt.show()
You can adjust the window_size, poly_order, and distance parameters to better suit your data. The window_size should be chosen based on the width of features in your signal, and distance should be set to avoid detecting multiple peaks/valleys around the same point.
Need a Custom Version or Complete Simulation for This Problem?
Our 500+ PhD engineers build, debug, and optimize working MATLAB scripts and Simulink (.slx) models tailored to your exact assignment rubrics with zero plagiarism.
Explore similar technical troubleshooting questions and verified MATLAB solutions: