Сигналы …



Мы начнем с того, что покажем, как случайные сигналы могут быть некоррелированными (кроме самих себя) и как они компенсируют себя.

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