Функция демодуляции: методы и примеры кода для обработки сигналов

«Функция демодуляции» относится к процессу, используемому при обработке сигнала для извлечения исходного базового сигнала из модулированного сигнала несущей. Функция демодуляции варьируется в зависимости от используемой схемы модуляции. Вот несколько распространенных методов модуляции и соответствующие им методы демодуляции, а также примеры кода:

  1. Амплитудная модуляция (АМ) Демодуляция:
    АМ – это метод модуляции, при котором амплитуда несущего сигнала изменяется для кодирования информации. Демодуляцию можно выполнить с использованием методов обнаружения огибающей, таких как метод обнаружения пиков. Вот пример на Python:
import numpy as np
def am_demodulation(signal, carrier_frequency, sampling_rate):
    carrier = np.cos(2 * np.pi * carrier_frequency * np.arange(len(signal)) / sampling_rate)
    demodulated_signal = signal * carrier
    return demodulated_signal
  1. Частотная модуляция (FM) Демодуляция:
    FM — это метод модуляции, при котором частота несущего сигнала изменяется для кодирования информации. Демодуляция FM-сигналов обычно выполняется с использованием метода фазовой автоподстройки частоты (ФАПЧ). Вот пример в MATLAB:
function demodulated_signal = fm_demodulation(signal, carrier_frequency, sampling_rate)
    t = (0:length(signal)-1) / sampling_rate;
    phase = 2 * pi * cumsum(signal) / sampling_rate;
    demodulated_signal = diff(phase) / (2 * pi * carrier_frequency);
end
  1. Фазовая модуляция (PM) Демодуляция:
    PM — это метод модуляции, при котором фаза несущего сигнала изменяется для кодирования информации. Демодуляцию сигналов ФМ можно выполнить путем дифференцирования фазы для получения мгновенной частоты. Вот пример на C++:
#include <vector>
#include <cmath>
std::vector<double> pm_demodulation(const std::vector<double>& signal, double carrier_frequency, double sampling_rate)
{
    std::vector<double> demodulated_signal(signal.size() - 1);
    for (size_t i = 1; i < signal.size(); ++i) {
        double phase_difference = std::atan2(std::sin(signal[i] - signal[i - 1]), std::cos(signal[i] - signal[i - 1]));
        demodulated_signal[i - 1] = phase_difference / (2 * M_PI * carrier_frequency / sampling_rate);
    }
    return demodulated_signal;
}