Вам нужен фильтр нижних частот на приемнике после когерентной демодуляции, это правильно. Но есть также проблема с вашей модуляцией. В вашем примере скорость передачи символов 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
A1=x.*sin(2*pi*fc*t);
приведет к тому жеA1
, что и весь ваш цикл. - person Dan   schedule 09.04.2013