Например TDA7294

Форум РадиоКот • Просмотр темы - Дискретное преобразование Фурье
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 19:17:45

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Дискретное преобразование Фурье
СообщениеДобавлено: Чт мар 23, 2017 18:42:35 
Первый раз сказал Мяу!

Зарегистрирован: Вс фев 05, 2012 17:41:28
Сообщений: 31
Рейтинг сообщения: 0
Здравствуйте! Нашёл в интернете код дискретного преобразования Фурье .
Немного подправил под себя.

main.c

Спойлер
Код:
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#define N 32
#include "lookup.h"
#define RS PB0
#define EN PB1
#define LCD_NIBBLE PORTD


void adc_init();
uint16_t adc_read();
void TRANSFORM();
void timer1_init();
void LCD_STROBE(void);
void lcd_data(unsigned char c);
void lcd_cmd(unsigned char c);
void lcd_clear(void);
void lcd_gotoxy(uint8_t x, uint8_t y);
void lcd_init();
void lcd_print(char *p, char l);
void lcd_fill_custom();

uint8_t lcd_buf1[16];
uint8_t lcd_buf2[16];

static uint16_t buf[16];
uint8_t val;
int32_t fx[N];
int32_t Fu[N/2][2];

int main(void)
{
   uint8_t mag;
   int i;
   adc_init();
   lcd_init();
   lcd_fill_custom();
   lcd_print("DFT SPECTROMETER",1);
   lcd_print("500Hz - 10KHz",2);
   _delay_ms(2000);
   lcd_clear();
   while(1) {
      
      for(i=0;i<N;i++) {
         _delay_us(40);
         fx[i] = ((int16_t)adc_read());
      }
      TRANSFORM();
      //lcd_cmd(0xc0);
      for(i=0; i<N/2; i++) {
         if(Fu[i][0]<0)Fu[i][0]*=-1;
         if(Fu[i][1]<0)Fu[i][1]*=-1;
         mag = (uint8_t)(Fu[i][0] + Fu[i][1])/4;
         
         if (mag< buf[i])
         buf[i]--;
         else
         buf[i] = mag;
         
      }
      
      for (i = 0; i < 16; i++) {
         val = buf[i];
         if (val > 15)
         val = 15;
         lcd_gotoxy(i, 0);
         if (val < 8)
         lcd_data(0x20);
         else
         lcd_data(val - 8);
         lcd_gotoxy(i, 1);
         if (val < 8)
         lcd_data(val);
         else
         lcd_data(0xFF);
      }
   
      _delay_ms(20);
      
      //lcd_cmd(0xc0);
      //for(i=0;i<16;i++)
      //lcd_data(i+8);
   }
}

void TRANSFORM()
{
   int16_t count,degree;
   uint8_t u,k;
   count = 0;
   for (u=0; u<N/2; u++) {
      for (k=0; k<N; k++) {
         degree = (uint16_t)pgm_read_byte_near(degree_lookup + count)*2;
         count++;
         Fu[u][0] +=  fx[k] * (int16_t)pgm_read_word_near(cos_lookup + degree);
         Fu[u][1] += -fx[k] * (int16_t)pgm_read_word_near(sin_lookup + degree);
      }
      Fu[u][0] /= N;
      Fu[u][0] /= 10000;
      Fu[u][1] /= N;
      Fu[u][1] /= 10000;
   }
}

void adc_init()
{
   ADMUX = 0b11000101;
   ADCSRA =0b10000010;
}



uint16_t adc_read()
{
   ADCSRA |= 1<<ADSC;
   while(!ADIF);
   ADCSRA |= 1<<ADIF;
   return ADCW;
}

void LCD_STROBE(void)
{
   PORTB |= (1 << EN);
   _delay_us(1);
   PORTB &= ~(1 << EN);
}

void lcd_data(unsigned char c)
{
   PORTB |= (1 << RS);
   _delay_us(50);
   LCD_NIBBLE = (c&0b11110000);
   LCD_STROBE();
   LCD_NIBBLE = ((c&0b00001111)<<4);
   LCD_STROBE();
}

void lcd_cmd(unsigned char c)
{
   PORTB &= ~(1 << RS);
   _delay_us(50);
   LCD_NIBBLE = (c&0b11110000);
   LCD_STROBE();
   LCD_NIBBLE = ((c&0b00001111)<<4);
   LCD_STROBE();
}

void lcd_clear(void)
{
   lcd_cmd(0x01);
   _delay_ms(5);
}
void lcd_gotoxy(uint8_t x, uint8_t y)   // ѕереместить курсор в позицию XY
{
   lcd_cmd(0x80 + (y ? 0x40 : 0) + x);
}
void lcd_init()
{
   DDRD = 0b11110000;
   DDRB |= (1 << RS)|(1 << EN);
   PORTD |= (1<<PC4);
   _delay_ms(15);
   lcd_cmd(0x30);
   _delay_ms(1);
   lcd_cmd(0x30);
   _delay_us(100);
   lcd_cmd(0x30);
   lcd_cmd(0x28);
   lcd_cmd(0x28);
   lcd_cmd(0x0c);
   lcd_clear();
   lcd_cmd(0x6);
}

void lcd_print(char *p, char l)
{
   if(l==1)lcd_cmd(0x80);
   else lcd_cmd(0xc0);
   while(*p)
   lcd_data(*p++);
}


void lcd_fill_custom()
{
   uint8_t i,j;
   i=0;j=0;
   lcd_cmd(64);
   for(i=1;i<=8;i++) {
      for(j=8;j>i;j--)
      lcd_data(0);
      for(j=i;j>0;j--)
      lcd_data(0xff);
   }
}


И lookup.h
Спойлер
Код:
//LOOKUP TABLE//
#include <avr/pgmspace.h>
 
PROGMEM const int16_t cos_lookup[]= {
    10000,9998,9993,9986,9975,9961,9945,9925,9902,
    9876,9848,9816,9781,9743,9702,9659,9612,9563,
    9510,9455,9396,9335,9271,9205,9135,9063,8987,
    8910,8829,8746,8660,8571,8480,8386,8290,8191,
    8090,7986,7880,7771,7660,7547,7431,7313,7193,
    7071,6946,6819,6691,6560,6427,6293,6156,6018,
    5877,5735,5591,5446,5299,5150,5000,4848,4694,
    4539,4383,4226,4067,3907,3746,3583,3420,3255,
    3090,2923,2756,2588,2419,2249,2079,1908,1736,
    1564,1391,1218,1045,871,697,523,348,174,
    0,-174,-348,-523,-697,-871,-1045,-1218,-1391,
    -1564,-1736,-1908,-2079,-2249,-2419,-2588,-2756,-2923,
    -3090,-3255,-3420,-3583,-3746,-3907,-4067,-4226,-4383,
    -4539,-4694,-4848,-4999,-5150,-5299,-5446,-5591,-5735,
    -5877,-6018,-6156,-6293,-6427,-6560,-6691,-6819,-6946,
    -7071,-7193,-7313,-7431,-7547,-7660,-7771,-7880,-7986,
    -8090,-8191,-8290,-8386,-8480,-8571,-8660,-8746,-8829,
    -8910,-8987,-9063,-9135,-9205,-9271,-9335,-9396,-9455,
    -9510,-9563,-9612,-9659,-9702,-9743,-9781,-9816,-9848,
    -9876,-9902,-9925,-9945,-9961,-9975,-9986,-9993,-9998,
    -10000,-9998,-9993,-9986,-9975,-9961,-9945,-9925,-9902,
    -9876,-9848,-9816,-9781,-9743,-9702,-9659,-9612,-9563,
    -9510,-9455,-9396,-9335,-9271,-9205,-9135,-9063,-8987,
    -8910,-8829,-8746,-8660,-8571,-8480,-8386,-8290,-8191,
    -8090,-7986,-7880,-7771,-7660,-7547,-7431,-7313,-7193,
    -7071,-6946,-6819,-6691,-6560,-6427,-6293,-6156,-6018,
    -5877,-5735,-5591,-5446,-5299,-5150,-5000,-4848,-4694,
    -4539,-4383,-4226,-4067,-3907,-3746,-3583,-3420,-3255,
    -3090,-2923,-2756,-2588,-2419,-2249,-2079,-1908,-1736,
    -1564,-1391,-1218,-1045,-871,-697,-523,-348,-174,
    0,174,348,523,697,871,1045,1218,1391,
    1564,1736,1908,2079,2249,2419,2588,2756,2923,
    3090,3255,3420,3583,3746,3907,4067,4226,4383,
    4539,4694,4848,5000,5150,5299,5446,5591,5735,
    5877,6018,6156,6293,6427,6560,6691,6819,6946,
    7071,7193,7313,7431,7547,7660,7771,7880,7986,
    8090,8191,8290,8386,8480,8571,8660,8746,8829,
    8910,8987,9063,9135,9205,9271,9335,9396,9455,
    9510,9563,9612,9659,9702,9743,9781,9816,9848,
    9876,9902,9925,9945,9961,9975,9986,9993,9998
};
 
PROGMEM const int16_t sin_lookup[]= {
    0,174,348,523,697,871,1045,1218,1391,
    1564,1736,1908,2079,2249,2419,2588,2756,2923,
    3090,3255,3420,3583,3746,3907,4067,4226,4383,
    4539,4694,4848,4999,5150,5299,5446,5591,5735,
    5877,6018,6156,6293,6427,6560,6691,6819,6946,
    7071,7193,7313,7431,7547,7660,7771,7880,7986,
    8090,8191,8290,8386,8480,8571,8660,8746,8829,
    8910,8987,9063,9135,9205,9271,9335,9396,9455,
    9510,9563,9612,9659,9702,9743,9781,9816,9848,
    9876,9902,9925,9945,9961,9975,9986,9993,9998,
    10000,9998,9993,9986,9975,9961,9945,9925,9902,
    9876,9848,9816,9781,9743,9702,9659,9612,9563,
    9510,9455,9396,9335,9271,9205,9135,9063,8987,
    8910,8829,8746,8660,8571,8480,8386,8290,8191,
    8090,7986,7880,7771,7660,7547,7431,7313,7193,
    7071,6946,6819,6691,6560,6427,6293,6156,6018,
    5877,5735,5591,5446,5299,5150,4999,4848,4694,
    4539,4383,4226,4067,3907,3746,3583,3420,3255,
    3090,2923,2756,2588,2419,2249,2079,1908,1736,
    1564,1391,1218,1045,871,697,523,348,174,
    0,-174,-348,-523,-697,-871,-1045,-1218,-1391,
    -1564,-1736,-1908,-2079,-2249,-2419,-2588,-2756,-2923,
    -3090,-3255,-3420,-3583,-3746,-3907,-4067,-4226,-4383,
    -4539,-4694,-4848,-4999,-5150,-5299,-5446,-5591,-5735,
    -5877,-6018,-6156,-6293,-6427,-6560,-6691,-6819,-6946,
    -7071,-7193,-7313,-7431,-7547,-7660,-7771,-7880,-7986,
    -8090,-8191,-8290,-8386,-8480,-8571,-8660,-8746,-8829,
    -8910,-8987,-9063,-9135,-9205,-9271,-9335,-9396,-9455,
    -9510,-9563,-9612,-9659,-9702,-9743,-9781,-9816,-9848,
    -9876,-9902,-9925,-9945,-9961,-9975,-9986,-9993,-9998,
    -10000,-9998,-9993,-9986,-9975,-9961,-9945,-9925,-9902,
    -9876,-9848,-9816,-9781,-9743,-9702,-9659,-9612,-9563,
    -9510,-9455,-9396,-9335,-9271,-9205,-9135,-9063,-8987,
    -8910,-8829,-8746,-8660,-8571,-8480,-8386,-8290,-8191,
    -8090,-7986,-7880,-7771,-7660,-7547,-7431,-7313,-7193,
    -7071,-6946,-6819,-6691,-6560,-6427,-6293,-6156,-6018,
    -5877,-5735,-5591,-5446,-5299,-5150,-5000,-4848,-4694,
    -4539,-4383,-4226,-4067,-3907,-3746,-3583,-3420,-3255,
    -3090,-2923,-2756,-2588,-2419,-2249,-2079,-1908,-1736,
    -1564,-1391,-1218,-1045,-871,-697,-523,-348,-174
};
 
PROGMEM const uint8_t degree_lookup[]= {
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,5,11,16,22,28,33,39,45,50,56,61,67,
    73,78,84,90,95,101,106,112,118,123,129,135,140,146,151,
    157,163,168,174,0,11,22,33,45,56,67,78,90,101,112,
    123,135,146,157,168,0,11,22,33,44,56,67,78,90,101,
    112,123,134,146,157,168,0,16,33,50,67,84,101,118,135,
    151,168,5,22,39,56,73,90,106,123,140,157,174,11,28,
    45,61,78,95,112,129,146,163,0,22,45,67,90,112,135,
    157,0,22,44,67,90,112,134,157,0,22,45,67,89,112,
    134,157,0,22,45,67,89,112,135,157,0,28,56,84,112,
    140,168,16,44,73,101,129,157,5,33,61,89,118,146,174,
    22,50,78,106,135,163,11,39,67,95,123,151,0,33,67,
    101,135,168,22,56,90,123,157,11,45,78,112,146,0,33,
    67,101,135,168,22,56,90,123,157,11,44,78,112,146,0,
    39,78,118,157,16,56,95,134,174,33,73,112,151,11,50,
    89,129,168,28,67,106,146,5,44,84,123,163,22,61,101,
    140,0,45,90,135,0,44,90,134,0,45,89,134,0,45,
    89,135,0,44,90,135,179,44,89,134,0,45,90,134,179,
    44,90,135,0,50,101,151,22,73,123,174,45,95,146,16,
    67,118,168,39,90,140,11,61,112,163,33,84,134,5,56,
    106,157,28,78,129,0,56,112,168,44,101,157,33,89,146,
    22,78,135,11,67,123,179,56,112,168,45,101,157,33,90,
    146,22,78,134,11,67,123,0,61,123,5,67,129,11,73,
    134,16,78,140,22,84,146,28,89,151,33,95,157,39,101,
    163,44,106,168,50,112,174,56,118,0,67,135,22,90,157,
    45,112,0,67,135,22,90,157,44,112,0,67,134,22,90,
    157,44,112,0,67,134,22,89,157,45,112,0,73,146,39,
    112,5,78,151,45,118,11,84,157,50,123,16,90,163,56,
    129,22,95,168,61,134,28,101,174,67,140,33,106,0,78,
    157,56,134,33,112,11,89,168,67,146,44,123,22,101,179,
    78,157,56,134,33,112,11,89,168,67,146,44,123,22,101,
    0,84,168,73,157,61,146,50,135,39,123,28,112,16,101,
    5,90,174,78,163,67,151,56,140,45,129,33,118,22,106,
    11,95
};


Кто подскажет как пересчитать degree_lookup[] в фале lookup.h?
Сейчас в нем расчет на 16 частот, но по факту работают только 15, первая записана нулями.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Дискретное преобразование Фурье
СообщениеДобавлено: Чт мар 23, 2017 19:09:49 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
первая - постоянная составляющая?

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Дискретное преобразование Фурье
СообщениеДобавлено: Чт мар 23, 2017 21:16:35 
Первый раз сказал Мяу!

Зарегистрирован: Вс фев 05, 2012 17:41:28
Сообщений: 31
Рейтинг сообщения: 0
ARV писал(а):
постоянная составляющая?

Ну да.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Дискретное преобразование Фурье
СообщениеДобавлено: Пт мар 24, 2017 06:42:09 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ну так она и может быть равна 0 для нормального симметричного сигнала с правильно наложенной оконной функцией.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Дискретное преобразование Фурье
СообщениеДобавлено: Пт мар 24, 2017 20:08:07 
Первый раз сказал Мяу!

Зарегистрирован: Вс фев 05, 2012 17:41:28
Сообщений: 31
Рейтинг сообщения: 0
Это понятно, но по факту в данном коде она не работает.
А вообще как пересчитать, их сейчас 16, а мне надо 20?


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y