Сигналы …
Мы начнем с того, что покажем, как случайные сигналы могут быть некоррелированными (кроме самих себя) и как они компенсируют себя.
import numpy as np import matplotlib.pyplot as plt # Function to generate normalized signals #def generate_normalized_signal(length): # return np.random.normal(loc=0, scale=1, size=length) # Function to generate normalized signals and scale to the range [-1, 1] def generate_scaled_signal(length): signal = np.random.normal(loc=0, scale=1, size=length) normalized_signal = (signal - np.min(signal)) / (np.max(signal) - np.min(signal)) scaled_signal = 2 * normalized_signal - 1 return scaled_signal def generate_scaled_signal_positive_and_negative_one(data): scaled_signal = np.where(data > 0, 1, -1) return scaled_signal # Number of data points in each signal num_data_points = 100 # List to store the generated signals signal_collection = [] number_of_signals = 100 number_of_signals_to_display = 3 # Generate the three normalized signals and store them in the signal_collection for _ in range(number_of_signals): signal_generated = generate_scaled_signal(num_data_points) # signal_generated = generate_scaled_signal_positive_and_negative_one(signal_generated) # signal_collection.append(signal_generated) # Summation of the signals summation_signal = sum(signal_collection)/number_of_signals # Plot the individual signals and their summation plt.figure(figsize=(12, 8)) for i in range(number_of_signals_to_display): plt.subplot(2, 3, (i+1)) plt.plot(signal_collection[i], label='Signal ' + str(i+1)) plt.legend() plt.subplot(2, 3, (number_of_signals_to_display + 1)) plt.plot(summation_signal, label='Summation') plt.legend() plt.subplot(2, 3, (number_of_signals_to_display + 2)) plt.plot(signal_collection[i], label='Signal ' + str(i+1)) plt.plot(summation_signal, label='Summation with sample signal') plt.legend() plt.tight_layout() plt.show()
_
Таким же образом, если данные сигнала нормализованы до +/- 1, с помощью generate_scaled_signal_positive_negative_one()
:
Хотя мы не можем вычислять коэффициент корреляции между сигналами, мы оставляем его здесь для справки. Давайте сосредоточимся на кросс- и автокорреляции:
def correlation_coefficient_Pearson(x, y): """ Calculate the Pearson correlation coefficient between two arrays x and y. Parameters: x (array-like): First array. y (array-like): Second array. Returns: float: Pearson correlation coefficient. """ if len(x) != len(y): raise ValueError("Both arrays must have the same length.") mean_x = np.mean(x) mean_y = np.mean(y) numerator = np.sum((x - mean_x) * (y - mean_y)) denominator_x = np.sum((x - mean_x) ** 2) denominator_y = np.sum((y - mean_y) ** 2) correlation_coefficient = numerator / np.sqrt(denominator_x * denominator_y) return correlation_coefficient def cross_correlation(signal_1, signal_2): """ Calculate the cross-correlation between two signals. Parameters: signal_1 (array-like): First input signal. signal_2 (array-like): Second input signal. Returns: array-like: Cross-correlation values. """ if len(signal_1) != len(signal_2): raise ValueError("Both signals must have the same length.") mean_signal_1 = np.mean(signal_1) mean_signal_2 = np.mean(signal_2) cross_corr_values = np.correlate(signal_1 - mean_signal_1, signal_2 - mean_signal_2, mode='full') return cross_corr_values signals_x = cross_correlation(signal_collection[0], signal_collection[1]) signals_auto = cross_correlation(signal_collection[0], signal_collection[0]) # Plot the individual signals and their summation plt.figure(figsize=(12, 8)) plt.plot(signals_auto, label='Signal auto-correlated') plt.plot(signals_x, label='Signal cross-correlated') plt.legend() plt.tight_layout() plt.show()
Давайте сдвинем сигналы несколько раз и посмотрим, как это «похоже» на себя.
signal_selected = signal_collection[0] n = len(signal_selected) shift_amount = 10 signal_shifted = [signal_selected[(i + shift_amount) % n] for i in range(n)] signals_x = cross_correlation(signal_shifted, signal_collection[0]) signals_auto = cross_correlation(signal_shifted, signal_shifted) # Plot the individual signals and their summation plt.figure(figsize=(12, 8)) plt.plot(signals_auto, label='Signal auto-correlated') plt.plot(signals_x, label='Signal cross-correlated') # do another time shift_amount = 40 signal_shifted = [signal_selected[(i + shift_amount) % n] for i in range(n)] signals_x = cross_correlation(signal_shifted, signal_collection[0]) plt.plot(signals_x, label='Signal cross-correlated') plt.legend() plt.tight_layout() plt.show()
Мы наблюдаем, что «сходство» падает.
Это связано с тем, как коды последовательности PRN работают в GPS. В этой статье мы не будем вдаваться в подробности.
… продолжение следует… [в разработке] вернуться еще…
Coding Towards The Answer 1. Part 1 2. Part 2 3. Part 3 4. Part 4 5. Part 5 6. Part 6 7. Part 7 8. Part 8 9. Part 9 10. Part 10