|
|
  |
Обнаружение частоты, Нужно вычеслить наличие 1000Гц |
|
|
|
Nov 25 2008, 13:56
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
1. корелятор и БПФ/ДПФ - cуть одно и тоже, ДПФ - векторный коррелятор с опорой в виде синусойды, все определяется тоько временем накопления (кличество отсчетов)! 2. если очень очень бысторо написать и попробывать то рекомендую сделать буфер на 3x512 отсчетов в первых двух расчитать и хранить синусойду и косинусойду 1000Гц - это будет опора в комплексном виде в последний записать выборку. оценка квадрата амплитуды сигнала 1000Гц вычисляется по формуле (1/512)*E( (cos[i]*y(i))^2 +(sin(i)y(i))^2 ) где Е - сумма 0...511 пример кода Код int main (void) { // допустим частота АЦП 10000Гц float adc_freq = 10000.0; float view_freq = 1000.0 ;
for (uint16_t i = 0; i < 512; i++) { buf_sin[i] = sin( (adc_freq / view_freq) * i * 2 * M_PI / 512); buf_sin[i] = cos( (adc_freq / view_freq) * i * 2 * M_PI / 512); }
// GetSamples();
volatile float AmpSqrt = 0.0; for (uint16_t i = 0; i < 512; i++) { AmpSqrt = pow(buf_sin[i]*buf_in[i],2) + pow(buf_cos[i]*buf_in[i],2); } return 1 ; } прогнал в авр студии - 7мгц частота проца, 88мега на вычисление одного значения потреюуется 44мс, тоесть Вы сможете 25 раз в секунду измерять. полоса примерно 100Гц. это если тупо использовать float, если использовать целочисленную арифметику то скорость можно увеличить в разы(соответственно и полосу сузить)
|
|
|
|
|
Nov 25 2008, 14:01
|

Частый гость
 
Группа: Участник
Сообщений: 178
Регистрация: 31-10-06
Из: Яблунець
Пользователь №: 21 821

|
Вот тут http://helper10.narod.ru/alg2.htmНашел такое: Главная идея такая: для каждой частоты котоpую тебе нужно отобpазить сочиняешь таблицу sin(Freq) и cos(Freq). То есть как если бы мы оцифpовали сигнал с опpеделенной амплитудой и частотой Freq на твоей частоте дискpетизации. Длина таблицы должна быть больше чем одна полуволна сигнала Freq. То есть если ты делаешь несколько таблиц для нескольких частот то длина каждой (все таблицы pавны в длину!) беpешь длину полуволны для низшей частоты. Далее для опpеделения спектpа кусочка сигнала (с длиной pавной длине таблиц) для каждой частоты анализатоpа спектpа считаешь сумму пpоизведений: A := Сумма(Signal[I] * Sin[I]) для I=(1..BlockLen) B := Сумма(Signal[I] * Cos[I]) для I=(1..BlockLen) После этого амплитуда данной частоты есть Sqrt(A^2 + B^2). Чтобы не вычислять коpень можешь делать пpосто A^2 + B^2. Hу и как-то их масштабиpуешь. Потом pисуешь палку соотв. длины и усе. Это для меня покатит?
|
|
|
|
|
Nov 25 2008, 21:17
|
Гуру
     
Группа: Почетный участник
Сообщений: 6 851
Регистрация: 25-08-08
Из: Запорожье
Пользователь №: 39 802

|
Цитата(Rst7 @ Nov 25 2008, 22:56)  Вашу ненависть к цифровым методам мы знаем. Предложите решение, если завтра человеку понадобится определить 10 разных частот одновременно? Десять LM'ок?  Не стоит тут трактовать мои чувства. завтра? так то будет завтра. А человек сегодня не может уверенно одну частоту обнаружить. Ему решение оптимальное и подсказали. Можно одной LM и десять частот обнаружить и весь спектр прочесать умеючи. Только не сразу, а поочередно. Кстати, вычисления так точно придется делать поочередно. или срочно затребовать десятиядерный контроллер....
|
|
|
|
|
Nov 25 2008, 22:49
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Microwatt @ Nov 25 2008, 21:37)  Да, тяжело в электронике программерам... Ну, куда ни сунься - везде гигабайта- другого не хватает... Сказано было сразу:LM567. Вот от нее и пляшите после тщательного изучения матчасти.... И перестраиваемый по частоте программно фильтр достаточно просто на ней организовать. А то- Фурье, корреляторы, матрицы- накопители, синус-косинусные преобразования.... Да всё это звучит грозно, а на деле ... Гигобайты это на ПиСишках, а здесь их нет и сотнями байтов укладываемся. Тот же DTMF делал на м8 - 10 режекторных фильтров. Пару килобайтов. Тут ещё одной информации не хватает - а именно превышение сигнала над фоном. Насколько сигнал чёткий будет? Корелятором тоже делал, но ... выделяет хуже, соотношение сигнал/шум держит хуже, времени тратит больше, проц загружает намного больше. Конечно фильтр перестраевыемый сделать значительно сложнее. Плавучку не потянешь, а фиксированная времени больше захавает, но какого-нибудь второго порядка вполне реально потянуть с 16-ти битной арифметикой с фиксированной точкой. Одну частоту. Если сигнал отчётливый.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|