[an error occurred while processing this directive]
Эх... (+)
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено уни 12 апреля 2006 г. 21:03
В ответ на: Да, я как раз самый что ни на есть начинающий. Буду благодарен, если положите где-нить. Спасибо. отправлено <font color=gray>уни</font> 12 апреля 2006 г. 15:56

Вот, значит, что дало загугливание по околосабжевой тематике (пока мене заливают буку, которая уже как-то была похоже на webfile):

- из статей:
1) Система передачи информации при помощи псевдохаотических сигналов
2) Характеристики цифровой системы фазовой автоподстройки частоты, Т. Келин, Д. Супонников
3) Matched filtering and timing recovery in digital receivers. A practical look at methods for signal detection and symbol synchronization. By Louis Litwin [0901Litwin32.pdf]
4) AT76C651B Datasheet
5) A Multi-Level QAM Demodulator LSI with Wideband Carrier Recovery and Dual Equalizing Mode [139.pdf]
6) Synchronisation in Digital Receivers. TUT/ICE/ M. Renfors & D. Babic [83050e.pdf]
7) AN96048_1.pdf DataSheet
8) A Low Complexity Carrier Recovery and Frequency Estimation Algorithm for Iridium Handset System [FA5_7.pdf]
9) V.90 modem software on ADSP 218x family [Guide.pdf]
10) [hdm8513a.pdf]
11) A Software Radio Receiver with Direct Conversion and Its Digital Processing [ieice-dec-2002.pdf]
12) MM74HC4046 DataSheet
13) CARRIER RECOVERY IN BURST-MODE 16-QAM. [MScThesis_chen.pdf]
14) PSK Demodulation. J. Mark Steber (Part 1) [PSK Demodulation.pdf]
15) Single- and Multi-carrier Quadrature Amplitude Modulation: Principles and Applications for Personal Communications, WLANs and Broadcasting [Sample_chap_22-24.pdf]
16) [slwa023.pdf]
17) 16QAM Symbol Timing Recovery in the Upstream Transmission of DOCSIS Standard [WangSpeidel.pdf]
18) Глава I. Введение в цифровое телевидение. Б.Локшин
19) Система ФАПЧ и ее применения. В. Голуб
20) PLL SYNTHESIZERS. Ask the Applications Engineer-30 by Adrian Fox [adrian.fox AT analog.com] [pll.pdf]

- некие куски кода и сценарии


1) A few people have been asking so here it is...
Please note the comments at the top. It generates FM and the PLL
then demodulates it...
%Phase Locked Loop
%T.J.Moir 2002 aberdonian_2...@yahoo.com
%This simulates an analogue PLL
%The VCO is sinusoidal but can be made a square wave
%Suggested parameters: Sample at 10000Hz,Carrier freq 1000Hz = VCO free
running freq
% Make baseband freq 1Hz and frequency deviation 10Hz.
% Make run time 1 second
%When you run this you will see the demodulated sine wave (1Hz) as
figure 1.
% It will have 2fcarrier (2fc) superimposed on top of it (as in a real
PLL)

(остальное в сети)

2) SigLab Version 7.00 22 October, 2005
В частности можно увидеть в файле "Examples\\tstqam16.c" код:


#if (DISPLAY_EYE_DIAGRAM || DISPLAY_CONSTELLATION)
/* Demodulate data and generate constellation and eye diagram data */
RxNibble = SDA_Qam16DemodulateDebug (OutputBuffer+(i*SAMPLES_PER_SYMBOL), pCarrierTable,
CARRIER_SINE_TABLE_SIZE,
&RxCarrierPhase, &RxSampleClock, CARRIER_TABLE_INCREMENT, SAMPLES_PER_SYMBOL,
RxIDelay, &RxIFilterIndex, RxQDelay, &RxQFilterIndex, RRCFCoeffs,
RRCF_LENGTH, RRCF_ENABLE,
EyeSamples+(i*SAMPLES_PER_SYMBOL), ConstellationPoints+ConstellationRxSymbolCount);
ConstellationRxSymbolCount++;
#else
/* Demodulate data */
RxNibble = SDA_Qam16Demodulate (OutputBuffer+(i*SAMPLES_PER_SYMBOL), pCarrierTable,
CARRIER_SINE_TABLE_SIZE,
&RxCarrierPhase, &RxSampleClock, CARRIER_TABLE_INCREMENT, SAMPLES_PER_SYMBOL,
RxIDelay, &RxIFilterIndex, RxQDelay, &RxQFilterIndex, RRCFCoeffs,
RRCF_LENGTH, RRCF_ENABLE);
#endif

RxNibble = SDA_Qam16DifferentialDecode (RxNibble, &PreviousRxNibble);
if (!RxStringNibbleCount) /* Keep track of Rx nibbles */
{
CharTmpVariable = (char)(RxNibble & 0x0f); /* LS Nibble */
RxStringNibbleCount = 1;
}
else
{
CharTmpVariable |= ((RxNibble << 4) & 0xf0); /* MS Nibble */
RxStringNibbleCount = 0;
if (ReceivedWordCount++ < TX_RX_PIPELINE_LENGTH)
{
CharTmpVariable = SDS_Descrambler1417WithInversion (CharTmpVariable, &RxShiftRegister, &RxOnesBitCount, &RxBitInversionFlag);
}
else
{
RxString[RxStringIndex++] = SDS_Descrambler1417WithInversion (CharTmpVariable, &RxShiftRegister, &RxOnesBitCount, &RxBitInversionFlag);
}
}


(остальное как и что - на электрониксе, поиском)
3) Файл рядом - test_qam.c

Видимо некогерентная (или наоборот идеальная) демодуляция (не совсем понял),
но структурная схема демодулятора просматривается наглядно.


// =========
/* Generate the PN source */
SDA_SignalGenerate (pPNSequence1, SIGLIB_PN_SEQUENCE, ((SFLOAT)0.9), SIGLIB_FILL, ((SFLOAT)0.05), ((SFLOAT)-0.45),
SIGLIB_FOUR, SIGLIB_ZERO, &Pns1Phase, &Pns1CurrentValue, SAMPLE_LENGTH);
SDA_SignalGenerate (pPNSequence2, SIGLIB_PN_SEQUENCE, ((SFLOAT)0.9), SIGLIB_FILL, ((SFLOAT)0.05), ((SFLOAT)-0.45),
SIGLIB_FOUR, SIGLIB_ZERO, &Pns2Phase, &Pns2CurrentValue, SAMPLE_LENGTH);

/* Generate the carriers */
SDA_SignalGenerate (pTxSine, SIGLIB_SINE_WAVE, SIGLIB_ONE, SIGLIB_FILL, ((SFLOAT)0.19), SIGLIB_ZERO,
SIGLIB_ZERO, SIGLIB_ZERO, &TxSinePhase, SIGLIB_NULL_SFLOAT_PTR, SAMPLE_LENGTH);
SDA_SignalGenerate (pTxCos, SIGLIB_COS_WAVE, SIGLIB_ONE, SIGLIB_FILL, ((SFLOAT)0.19), SIGLIB_ZERO,
SIGLIB_ZERO, SIGLIB_ZERO, &TxCosinePhase, SIGLIB_NULL_SFLOAT_PTR, SAMPLE_LENGTH);

/* Modulate with the carrier */
SDA_Multiply2 (pPNSequence1, pTxSine, pPNSequence1, SAMPLE_LENGTH);
SDA_Multiply2 (pPNSequence2, pTxCos, pPNSequence2, SAMPLE_LENGTH);

/* Add I and Q signals */
SDA_Add2 (pPNSequence1, pPNSequence2, pPNSequence1, SAMPLE_LENGTH);

/* Add some noise */
SDA_SignalGenerate (pPNSequence1, SIGLIB_WHITE_NOISE, ((SFLOAT)0.07), SIGLIB_ADD, SIGLIB_ZERO, SIGLIB_ZERO,
SIGLIB_ZERO, SIGLIB_ZERO, SIGLIB_NULL_SFLOAT_PTR, SIGLIB_NULL_SFLOAT_PTR, SAMPLE_LENGTH);

/* Generate the demodulators */
SDA_SignalGenerate (pRxSine, SIGLIB_SINE_WAVE, SIGLIB_ONE, SIGLIB_FILL, ((SFLOAT)0.19), SIGLIB_ZERO,
SIGLIB_ZERO, SIGLIB_ZERO, &RxSinePhase, SIGLIB_NULL_SFLOAT_PTR, SAMPLE_LENGTH);
SDA_SignalGenerate (pRxCos, SIGLIB_COS_WAVE, SIGLIB_ONE, SIGLIB_FILL, ((SFLOAT)0.19), SIGLIB_ZERO,
SIGLIB_ZERO, SIGLIB_ZERO, &RxCosinePhase, SIGLIB_NULL_SFLOAT_PTR, SAMPLE_LENGTH);

SDA_Copy (pPNSequence1, pPNSequence2, SAMPLE_LENGTH);

/* Demodulate the signal */
SDA_Multiply2 (pPNSequence1, pRxSine, pPNSequence1, SAMPLE_LENGTH);
SDA_Multiply2 (pPNSequence2, pRxCos, pPNSequence2, SAMPLE_LENGTH);

/* Filter demodulated signals */
SDA_Iir (pPNSequence1, pPNSequence1, pFilterState1, pFilterTaps,
FILTER_STAGES, SAMPLE_LENGTH);

SDA_Iir (pPNSequence2, pPNSequence2, pFilterState2, pFilterTaps,
FILTER_STAGES, SAMPLE_LENGTH);
// =================

4) Это взято из SoftModem Library для dsPIC30F:
["\\dsPIC30F Soft Modem Library\\V.22bis Modem_R1.0\\source\\DP\\CARREC.S"]


/******************************************************************************
; Author: Third-Party Developer *
; Filename: CARREC.S *
; Date: 12th August,2002 *
; *
; Tools used: MPLAB IDE -> 6.43.00.0 *
; Language tools -> 1.20.01 *
; *
; Linker File: p30f6014.gld *
; *
; Revision History: *
; ----------------------------------------------------------------------------*
; Rev: Date: Details: Who: *
; ----------------------------------------------------------------------------*
; 0.1 18th July 2002 Code Created Ravi *
; 0.2 19th July 2002 Code Reviewed Raghava *
; 0.3 12 August 2002 Modified file/function header Ravi *
; 0.4 20 August 2002 Corrected code documentation faults Ravi *
;******************************************************************************
; Notes: *
; ====== *
; Carrier Recovery implementation for Microchip's dsPIC30F 16-bit MCU *
; Description: In a QAM Receiver, Carrier Recovery is employed primarily for *
; tracking changes in the received carrier. If a FSE is used in*
; the receiver, it is not required to compensate the phase *
; offset.But the frequency offset needs to be compensated by the*
; carrier recover circuit *
; *
; Module Re-entrancy: *
; Module re-entrancy is not supported *
;******************************************************************************


(искать у Микрочипа)

5) Кое-что от SM'а

/*
Тут применены два разных детектора. Тот, что включен сейчас, долго
синхронизируется, но меньше "болтает" частотой вокруг истины". Это то,
что я в мыле отправлял.
Второй - содран с детектора 74HC4046. Быстрее входит в синхронизм,
но сильнее болтается.
*/

(искать тут на телесисах)

6) Опять же здешнее, но уже не помню чьё - fsk_dem_1.m


clear;
input_cont = wavread('4000good.wav'); %âõîäíàÿ ïîñûëêà
input_lenght = uint32(size(input_cont, 1));
fd = 4000; %÷àñòîòà äèñêðåòèçàöèè
f1 = 1000; %íåñóùàÿ åäèíèöû
f0 = 1333; %íåñóùàÿ íóëÿ
N0 = uint32(12); %êîëè÷åñòâî îòñ÷åòîâ íà áèò ïðè 333 áîäàõ
N1 = uint32(12);
output_one = zeros(input_lenght, 1);
output_null = zeros(input_lenght, 1);
output_logic = zeros(input_lenght, 1);
tmp1 = 0;
tmp0 = 0;
for n = uint32(N1 + 1) : (input_lenght - N1);

%----------------------------------------------------------------
tmp11 = 0;
for k = n : (n + N1 - 1);
alfa = exp(i * 2 * pi * f1 * double(k) / fd);
tmp11 = tmp11 + (input_cont(k) * alfa);
end
% ÝÒÎ ÅÑÒÜ ÓÌÍÎÆÅÍÈÅ ÍÀ ÊÎÌÏË. ÝÊÑÏÎÍÅÍÒÓ + ÔÈËÜÒÐ "ÑÊÎËÜÇßÙÅÃÎ ÑÐÅÄÍÅÃÎ"


tmp1 = ((real(tmp11))^2 + (imag(tmp11))^2) / double(N1);
output_one(n) = sqrt(tmp1);
% ÂÛ ÇÀÁÛËÈ ÂÇßÒÜ ÊÂ. ÊÎÐÅÍÜ - ÂÎÒ ÒÅÏÅÐÜ ÝÒÎ ÌÎÄÓËÜ ÊÎÌÏËÅÊÑÍÎÉ ÀÌÏËÈÒÓÄÛ


end
for n = uint32(N0 + 1) : (input_lenght - N0);
tmp00 = 0;
for k = n : (n + N0 - 1);
alfa = exp(i * 2 * pi * f0 * double(k) / fd);
tmp00 = tmp00 + (input_cont(k) * alfa);
end
tmp0 = ((real(tmp00))^2 + (imag(tmp00))^2) / double(N0);
output_null(n) = sqrt(tmp0);
end

output_delta = (output_null - output_one) ;
% ÒÀÊÒÎÂÓÞ ÑÈÍÕÐÎÍÈÇÀÖÈÞ ÍÓÆÍÎ ÄÅËÀÒÜ ÏÎ ÝÒÎÌÓ ÑÈÃÍÀËÓ - ÏÎÂÛÑÈÒÑß ÅÅ
% ÏÎÌÅÕÎÓÑÒÎÉ×ÈÂÎÑÒÜ, ÍÀÏÐÈÌÅÐ, ÂÎÒ ÒÀÊ.
aa=abs(output_delta(900:1500));
aa=aa-mean(aa);
plot(abs(fft(aa)))
% ÂÈÄÈÒÅ ÏÀËÊÓ Â ÑÏÅÊÒÐÅ È ÅÅ ÃÀÐÌÎÍÈÊÈ? ÝÒÎ È ÅÑÒÜ ÒÀÊÒÎÂÀß ×ÀÑÒÎÒÀ!!!

output_logic = (output_null < output_one) ; %âûõîäíîé ñèãíàë

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ñèíõðîíèçàöèÿ ïîñûëêè
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n = int32(N0*8 + 1);
bod_out = zeros(input_lenght, 1); %ìåàíäð äëà âèçóàëüíîé ðàñøèôðîâêè êîäîãðàììû
while n < input_lenght
if output_logic(n) == 0 %äîæäàòüñÿ ïåðåïàäà 1-0
m = 1;
i = n;
while i > (n-int32(N0*8)) %Ïåðåä 0 äîëæíà áûòü ïðåàìáóëà ìèíèìóì 8 åäèíè÷åê
i = i - 1;
m = m & output_logic(i);
end
ii = 1;
if m
for ii = 1: 20 %ôîðìèðîâàíèå ïðåàìáóëû â ðàñøèôðîâàííîé êîäîãðàììå
out(ii) = 1; %ðàñøèôðîâàííàÿ êîäîãðàììà
end
while n < (input_lenght - N0*2)
tmp0 = 0;
for i = n: (n + int32(N0) - 1)
tmp0 = tmp0 + output_logic(i);
bod_out(i) = 1;
end
out(ii) = ((tmp0 / N0) >= 0.5); %1 åñëè ñðåäíÿÿ àìïëèòóäà çà áîä >= 0.5
ii = ii + 1;
tmp0 = 0;
n = n + int32(N0);
for i = n: (n + int32(N0) - 1)
tmp0 = tmp0 + output_logic(i);
bod_out(i) = 0;
end
out(ii) = ((tmp0 / N0) >= 0.5); %1 åñëè ñðåäíÿÿ àìïëèòóäà çà áîä >= 0.5
ii = ii + 1;
n = n + int32(N0);
end
break;
end
end
n = n + 1;
end
input_cont = input_cont(6:input_lenght, 1); %ñìåñòèòü âõîäíóþ âûáîðêó äëÿ óäîáñòâà ïðîñìîòðà
plottools;

Ну, это, что вспомнил по горячим следам, то и выписал для себя на память. Очень мало, хотелось бы залезть в один из приведённых тут некогда небольшом ftp на десяток гигов с эл. книжками. Может там чего есть.

KEYWORDS (Ключевые слова): QAM, 16QAM, PSK, DPLL, PLL, modem

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru