Фильтр нижних частот при модуляции несущей и демодуляции

Я разрабатываю проект, в котором массив проходит через квадратурную амплитудную модуляцию (QAM) модулятор, а затем выполнить модуляцию несущей, сделать ее воспроизводимой с помощью sound() команду, затем демодулируйте ее обратно для демодуляции QAM.

Во-первых, я использовал стандартный способ модуляции QAM:

M = 16;
x = randint(5000, 1, M);
y = modulate(modem.qammod(M), x);

Затем я написал свою собственную функцию модуляции несущей:

function [out] = carriermodulation(x)
fs = 16000;
T = 1.0 / 4000;
fc = 8000;
Q = real(x);
I = imag(x);
t = 0:T:(size(x))*T;
C1 = zeros(size(x), 1);
C2 = zeros(size(x), 1);
for i = 1:size(x)
    C1(i) = I(i)*sin(2*pi*(fc)*t(i));
    C2(i) = Q(i)*sin(2*pi*fc*t(i) + pi/2);
end

out = C1 + C2;

Пока нет проблем. Но когда я закончил с моей функцией демодуляции, я обнаружил, что результат отличается от исходного значения (выход модулятора QAM).

function [out] = carrierdemodulation(x)
fs = 16000;
T = 1.0 / 4000;
fc = 8000;
t = 0:T:(size(x))*T;
A1 = zeros( size(x), 1);
A2 = zeros( size(x), 1);
for i = 1:size(x)
    A1(i) = x(i)*sin( 2*pi*(fc)*t(i));
    A2(i) = x(i)*cos( 2*pi*(fc)*t(i));
end
A1 = sqrt(A1);
A2 = sqrt(A2);
out = A1 + A2;

Я думаю, что моя часть модуляции правильная. Единственная проблема, которую я думаю, это то, что у меня нет фильтра нижних частот ( LPF) для демодуляции. И я не должен вычислять A1 и A2 напрямую. Как мне добавить LPF к моему коду демодуляции, чтобы результат был таким же, как и оригинал?


person Junfei Wang    schedule 08.04.2013    source источник
comment
В качестве примечания вы можете отказаться от циклов for и воспользоваться преимуществами векторизованного синтаксиса Matlab. Эта единственная строка A1=x.*sin(2*pi*fc*t); приведет к тому же A1, что и весь ваш цикл.   -  person Dan    schedule 09.04.2013
comment
@Dan, спасибо за совет, это моя первая программа Matlab.   -  person Junfei Wang    schedule 09.04.2013
comment
np, но если вы надеетесь получить помощь по фильтру нижних частот, вам нужно показать некоторую попытку понять, что такое фильтр нижних частот и как подойти к его разработке. Люди здесь помогут вам с кодом, но они не будут кодировать для вас. Также, если ваш вопрос заключается в том, как спроектировать LPF, вы можете попробовать dsp.stackexchange, а...   -  person Dan    schedule 09.04.2013


Ответы (1)


Вам нужен фильтр нижних частот на приемнике после когерентной демодуляции, это правильно. Но есть также проблема с вашей модуляцией. В вашем примере скорость передачи символов Rs меньше угловой несущей частоты w_c, что потенциально может привести к перекрытию спектров в приемнике. Следовательно, восстановление информационного сигнала будет невозможно. Кроме того, в вашем примере fc * T = 2. Это означает, что аргумент функции синуса является целым числом, кратным 2pi, и поэтому всегда равен нулю.

Что вам нужно, так это формирователь импульсов (можно реализовать как фильтр нижних частот) на передатчике с полосой пропускания w_g >= R/2. Это должен быть так называемый фильтр нижних частот Найквиста. Несущая частота должна удовлетворять w_c > w_g.

Я написал скрипт MATLAB, который выполняет формирование импульса, модуляцию, демодуляцию, фильтрацию и выборку. так что переданный сигнал может быть восстановлен.

Сначала мы определяем параметры, создаем случайные биты и делаем отображение, как вы уже сделали. Затем используется очень простая импульсная характеристика для формирования импульса, а именно прямоугольный импульс. В реальном мире мы переходим от цифровой области к аналоговой, но поскольку это компьютерная модель, мы представляем аналоговый сигнал дискретным с частотой дискретизации f_s. Формирователь импульса прост, потому что он просто повторяет каждый образец L раз.

M = 16; % QAM order
fs = 16000; % Sampling frequency in Hz
Ts = 1/fs; % Sampling interval in s
fc = 1000; % Carrier frequency in Hz (must be < fs/2 and > fg)
Rs = 100; % Symbol rate
Ns = 20; % Number of symbols

x = randint(Ns, 1, M);
y = modulate(modem.qammod(M), x);

L = fs / Rs; % Oversampling factor

% Impulse shaping
y_a = reshape(repmat(y', L, 1), 1, length(y)*L);

Теперь модуляция. Я использовал несущую частоту, которая удовлетворяет вышеуказанным условиям: она выше, чем ширина полосы сигнала, и ее все еще можно представить с помощью используемой частоты дискретизации.

%% Modulation
I = real(y_a);
Q = imag(y_a);
t = 0 : Ts : (length(y_a) - 1) * Ts;
C1 = I .* sin(2*pi * fc * t);
C2 = Q .* cos(2*pi * fc * t);
s = C1 + C2;

Демодуляция проста...

%% Demodulation
r_I = s .* sin(2*pi * fc * t);
r_Q = s .* -cos(2*pi * fc * t);

Для удаления спектральных составляющих на 2f_c после демодуляции требуется фильтр нижних частот. Я использовал MATLAB FDATool. для создания фильтра и часть следующего кода. Помните: ширина полосы сигнала составляет Rs/2, а нежелательные ответвления начинаются с 2*fc - Rs/2. Вот как находятся Fpass и Fstop. (Может быть полезно немного ослабить эти требования.)

%% Filter

% Design filter with least-squares method
N     = 50;           % Order
Fpass = Rs/2;         % Passband Frequency
Fstop = 2*fc - Rs/2;  % Stopband Frequency
Wpass = 1;            % Passband Weight
Wstop = 1;            % Stopband Weight

% Calculate the coefficients using the FIRLS function.
b  = firls(N, [0 Fpass Fstop fs/2]/(fs/2), [1 1 0 0], [Wpass Wstop]);

% Filtering
w_I = filter(b, 1, r_I);
w_Q = filter(b, 1, r_Q);

После фильтрации нам все еще нужно сэмплировать полученный сигнал. Здесь просто даунсемплинг. Я использовал смещение фазы L/2, чтобы избежать переходов фильтра.

%% Sampling
u_I = downsample(w_I, L, L/2);
u_Q = downsample(w_Q, L, L/2);

Наконец, постройте диаграмму созвездия и получите красивое созвездие 16-QAM:

plot(u_I, u_Q, '.');

Полный код можно найти здесь.

Ваш вопрос затронул множество тем как DSP, так и программирования в MATLAB. Я не мог вдаваться во все подробности. Если у вас есть конкретные вопросы о модуляции и демодуляции 16-QAM, вам, вероятно, следует обратиться к сайту Stack Exchange Signal Processing<. /эм>.

person Deve    schedule 10.04.2013
comment
Вы мой спасатель, Большое вам спасибо!!!! Я хотел бы дать вам больше репутации .. :) - person Junfei Wang; 10.04.2013
comment
По поводу вашего (теперь удаленного) комментария: вы были правы. Случайно поменял местами I и Q в модуляции и забыл минус перед косинусом в демодуляции. Я исправил свой ответ. - person Deve; 10.04.2013
comment
Я уже решил эту проблему сам, спасибо!! Другой вопрос: что такое переменная FG в вашем коде? И почему не получается, если я устанавливаю fs=44000, fc=11000 и rs=11000? - person Junfei Wang; 11.04.2013
comment
Я использовал fg для частоты среза основного сигнала. Но только в комментарии. Установка fc = rs, вероятно, не работает по двум причинам: 1) используемый здесь формирователь импульсов имеет большую полосу пропускания, поэтому может произойти перекрытие полосы модулирующих частот и нежелательных трибутарных сигналов. 2) фильтр плохо работает, когда полоса пропускания и частота полосы задерживания близки. Вы должны выбрать несущую частоту, которая значительно больше, чем скорость передачи символов, или использовать другой формирователь импульсов (ищите приподнятый косинус) и/или другой приемный фильтр. - person Deve; 11.04.2013