«Функция демодуляции» относится к процессу, используемому при обработке сигнала для извлечения исходного базового сигнала из модулированного сигнала несущей. Функция демодуляции варьируется в зависимости от используемой схемы модуляции. Вот несколько распространенных методов модуляции и соответствующие им методы демодуляции, а также примеры кода:
- Амплитудная модуляция (АМ) Демодуляция:
АМ – это метод модуляции, при котором амплитуда несущего сигнала изменяется для кодирования информации. Демодуляцию можно выполнить с использованием методов обнаружения огибающей, таких как метод обнаружения пиков. Вот пример на 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
- Частотная модуляция (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
- Фазовая модуляция (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;
}