[an error occurred while processing this directive]
Попробую задать вопрос. Анализ частоты, что я делаю не так?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено анализатор 11 января 2005 г. 10:35
В ответ на: Как в конфе втавить в сообщение исходник на "C" чтоб не покарёжило? отправлено анализатор 11 января 2005 г. 10:03

Создаю на ПК таблицу значений знака синуса и косинуса


#define FREQ 1000 // Исследуемая частота в Герцах
#define SAMPLFREQ 4096 // Частота дисретизации в Герцах
#define SAMPLECOUNT 208 // Количество необходимых отсчетов
#define LENGTHBYTE SAMPLECOUNT/8

int main(int argc, char* argv[])
{
const double PI = 3.1415926535897932384626433832795;
double T = 0;
u08 tmp;

tmp = 0;
printf("sin = \n");
for(u08 j = 0; j < LENGTHBYTE; j++)
{
for(u08 i = 0; i < 8; i++)
{ tmp += tmp;
if(sin(2*PI*FREQ*T) > 0) tmp++;
T += 1.0/SAMPLFREQ;
}
if(j == (LENGTHBYTE-1)) printf("0x0%x", tmp);
else printf("0x0%x, ", tmp);
}

printf("\ncos = \n");
tmp = 0; T = 0;
for(j = 0; j < LENGTHBYTE; j++)
{
for(u08 i = 0; i < 8; i++)
{ tmp += tmp;
if(cos(2*PI*FREQ*T) > 0) tmp++;
T += 1.0/SAMPLFREQ;
}
if(j == (LENGTHBYTE-1)) printf("0x0%x\n", tmp);
else printf("0x0%x, ", tmp);
}
return 0;
}


Полученные значения вставляю в программу на Keil для 51
"signal.h"

typedef unsigned int u16;
typedef unsigned char u08;

#include

#define signalIn P1_2
#define __sleep() PCON |= 0x01 // Go to sleep mode


// Таблица значений знака синуса для частоты 1000 Герц
// с частотой дискретизации 4096 Гц
static u08 code sinTable[11] = {
0x0ee, 0x0e6, 0x066, 0x066, 0x077, 0x077, 0x077, 0x033, 0x033, 0x03b, 0x0bb
};

// Таблица значений знака косинуса для частоты 1000 Герц
// с частотой дискретизации 4096 Гц
static u08 code cosTable[11] = {
0x022, 0x023, 0x033, 0x033, 0x011, 0x011, 0x011, 0x099, 0x099, 0x088, 0x088
};


"signal.c"

#include "signal.h"
#include

bit inputSignal;
u08 countSig = 0,
sinCount = 0,
cosCount = 0;

void ext_int0(void) interrupt 0
{
countSig++;
inputSignal = signalIn;
}

void init(void)
{
P1 = 0x0ff; P3 = 0x0ff;
// Enable external 0 interrupt
IT0 = 1; // Внешнее прерывание по перепаду импульса из 1 в 0.
}

void main(void)
{
u16 sum;

init();
while(1)
{
while(!signalIn);
IE = 0x081;

do
{ if(((sinTable[countSig/8] << сountSig%8) & 0x080) == inputSignal) sinCount++; // совпадение со знаком sin
else sinCount--;
if(((cosTable[countSig/8] << сountSig%8) & 0x080) == inputSignal) cosCount++; // совпадение со знаком cos
else cosCount--;
__sleep();
} while(countSig != 82);

IE = 0x080;
sum = sinCount*sinCount + cosCount*cosCount;
countSig = 0;
}

}


В итоге получаю полный бред. Не видно ни какого максимума. Все пожоже зависит только от сдвига фаз сигналов.

На вход 51 подаю сигнал (800)1000(1200) Гц идеальный(без помех) через компаратор схема как в аоне на z80.

Собственно вопрос. Что я делаю не так? Вроде все по теории.



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

Ответы


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

Имя (обязательно): 
Пароль: 
E-mail: 

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

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

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


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru