демодулятор SSB
Re: демодулятор SSB
DEL
Последний раз редактировалось Andrey 15 июн 2018, 11:49, всего редактировалось 1 раз.
Re: демодулятор SSB
DEL
Последний раз редактировалось Andrey 15 июн 2018, 11:49, всего редактировалось 1 раз.
Re: демодулятор SSB
DEL
Последний раз редактировалось Andrey 15 июн 2018, 11:48, всего редактировалось 1 раз.
Re: демодулятор SSB
DEL
Последний раз редактировалось Andrey 15 июн 2018, 11:48, всего редактировалось 1 раз.
Re: демодулятор SSB
Сергей ,а если у нас входной сигнал I+jQ, то можно сделать с ним ОБФ ? И что в результате получится вот это ?
- Вложения
-
- ОПФ.png (8.87 КБ) 4855 просмотров
- Бахурин Сергей
- Администратор
- Сообщения: 1114
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: демодулятор SSB
Как расшифровывается ОБФ?
Re: демодулятор SSB
Обшибся ОПФ, обратное преобpазование Фурье, (ну ДПФ мы сделали жезкой)
вот версия под arduino DUE, 2 кГц частота дискретизации, ,...
вот версия под arduino DUE, 2 кГц частота дискретизации, ,...
Код: Выделить всё
#include <DueTimer.h>
#define Ntap 31
#define DCgain 32768
int myLed = 13;
int OutSample,I,Q,N,X1,X2,X3,Y1,Y2,Y3;
float count=0;
int led_flag=0;
int cos_N[4]={1,0,-1,0};
int sin_N[4]={0,1,0,-1};
int sin_N_m[4]={0,-1,0,1};
bool ledOn = false;
// Фильтр канала Q
int fir_Q(int NewSample) {
int FIRCoef[Ntap] = {
-98,
-92,
159,
143,
-265,
-220,
450,
335,
-792,
-490,
1469,
671,
-3046,
-827,
10313,
17347,
10313,
-827,
-3046,
671,
1469,
-490,
-792,
335,
450,
-220,
-265,
143,
159,
-92,
-98
};
static int x[Ntap]; //input samples
long int y=0; //output sample
int n;
//shift the old samples
for(n=Ntap-1; n>0; n--)
x[n] = x[n-1];
//Calculate the new output
x[0] = NewSample;
for(n=0; n<Ntap; n++)
y += FIRCoef[n] * x[n];
return y / DCgain;
}
// Фильтр канала I
int fir_I(int NewSample) {
int FIRCoef[Ntap] = {
-98,
-92,
159,
143,
-265,
-220,
450,
335,
-792,
-490,
1469,
671,
-3046,
-827,
10313,
17347,
10313,
-827,
-3046,
671,
1469,
-490,
-792,
335,
450,
-220,
-265,
143,
159,
-92,
-98
};
static int x[Ntap]; //input samples
long int y=0; //output sample
int n;
//shift the old samples
for(n=Ntap-1; n>0; n--)
x[n] = x[n-1];
//Calculate the new output
x[0] = NewSample;
for(n=0; n<Ntap; n++)
y += FIRCoef[n] * x[n];
return y / DCgain;
}
void myHandler(){ // обработчик прерывания по таймеру
if (N==3)
{
N=0;
}
else N++;
I=analogRead(A0);
Q=analogRead(A1);
X1=I*cos_N[N]+Q*sin_N[N];
X2=fir_I(X1);
X3=X2*cos_N[N];
Y1=I*sin_N_m[N]+Q*cos_N[N];
Y2=fir_Q(Y1);
Y3=Y2*sin_N_m[N];
OutSample=X3+Y3;
OutSample=OutSample;// восстанавливаем однополярный сигнал
analogWrite(DAC0, OutSample);
}
void setup(){
pinMode(myLed, OUTPUT);
Timer3.attachInterrupt(myHandler);
Timer3.start(500); // Calls every 50ms
pinMode(DAC0, OUTPUT);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
REG_PIOC_OER = 0x1 <<22;
REG_PIOB_OER = 0x1 <<27;
analogWriteResolution(12);
analogReadResolution(12);
}
void loop(){
while(1){
REG_PIOC_SODR = 0x1 << 22; //c22 = 8 pin
REG_PIOB_CODR = 0x1 << 27; //b27=13 pin
delay(1000);
REG_PIOC_CODR = 0x1 << 22; //c22=8 pin
REG_PIOB_SODR = 0x1 << 27; //b27 = 13 pin
delay(1000);
}
}
Re: демодулятор SSB
Трещит хорошо, нужно делать квадратурный смеситель, и подать на вход I Q, и проверить работоспособность, но лень,
Да и диодов у меня нет подходящих под рукой (((((
Да и диодов у меня нет подходящих под рукой (((((
Re: демодулятор SSB
Сергей сделал все по схеме, на выходе фильтра нет(после DAC), очень хорошо слышу тон 2 кГц, входы в ХХ, при подаче сигнала на входы IQ тон пропадает,
Это так должно быть, или я неправильно реализовал алгоритм схемы ? Схема с сайта dsplib.ru
Это так должно быть, или я неправильно реализовал алгоритм схемы ? Схема с сайта dsplib.ru
Код: Выделить всё
#include <DueTimer.h>
#define Ntap 31
#define DCgain 32768
int myLed = 13;
int OutSample,I,Q,N,X1,X2,X3,Y1,Y2,Y3;
float count=0;
int led_flag=0;
int cos_N[4]={1,0,-1,0};
int sin_N[4]={0,1,0,-1};
int sin_N_m[4]={0,-1,0,1};
bool ledOn = false;
// Фильтр канала Q
int fir_Q(int NewSample) {
int FIRCoef[Ntap] = {
-92,
159,
143,
-265,
-220,
450,
335,
-792,
-490,
1469,
671,
-3046,
-827,
10313,
17347,
10313,
-827,
-3046,
671,
1469,
-490,
-792,
335,
450,
-220,
-265,
143,
159,
-92,
-98
};
static int x[Ntap]; //input samples
long int y=0; //output sample
int n;
//shift the old samples
for(n=Ntap-1; n>0; n--)
x[n] = x[n-1];
//Calculate the new output
x[0] = NewSample;
for(n=0; n<Ntap; n++)
y += FIRCoef[n] * x[n];
return y / DCgain;
}
// Фильтр канала I
int fir_I(int NewSample) {
int FIRCoef[Ntap] = {
-98,
-92,
159,
143,
-265,
-220,
450,
335,
-792,
-490,
1469,
671,
-3046,
-827,
10313,
17347,
10313,
-827,
-3046,
671,
1469,
-490,
-792,
335,
450,
-220,
-265,
143,
159,
-92,
-98
};
static int x[Ntap]; //input samples
long int y=0; //output sample
int n;
//shift the old samples
for(n=Ntap-1; n>0; n--)
x[n] = x[n-1];
//Calculate the new output
x[0] = NewSample;
for(n=0; n<Ntap; n++)
y += FIRCoef[n] * x[n];
return y / DCgain;
}
void myHandler(){ // обработчик прерывания по таймеру
if (N==3)
{
N=0;
}
else N++;
I=analogRead(A0);
Q=analogRead(A1);
X1=I*cos_N[N]+Q*sin_N[N];
X2=fir_I(X1);
X3=X2*cos_N[N];
Y1=I*sin_N_m[N]+Q*cos_N[N];
Y2=fir_Q(Y1);
Y3=Y2*sin_N_m[N];
OutSample=X3+Y3;
OutSample=OutSample;// восстанавливаем однополярный сигнал
analogWrite(DAC1, OutSample);
}
void setup(){
pinMode(myLed, OUTPUT);
Timer3.attachInterrupt(myHandler);
Timer3.start(500); // Calls every 50ms
pinMode(DAC1, OUTPUT);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
REG_PIOC_OER = 0x1 <<22;
REG_PIOB_OER = 0x1 <<27;
// analogWriteResolution(12);
// analogReadResolution(12);
}
void loop(){
while(1){
REG_PIOC_SODR = 0x1 << 22; //c22 = 8 pin
REG_PIOB_CODR = 0x1 << 27; //b27=13 pin
delay(1000);
REG_PIOC_CODR = 0x1 << 22; //c22=8 pin
REG_PIOB_SODR = 0x1 << 27; //b27 = 13 pin
delay(1000);
}
}