Jump to content

    

Allregia

Свой
  • Content Count

    1170
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Allregia

  • Rank
    Профессионал

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

3618 profile views
  1. Джентельмены (и леди), посыпаю голову пеплом - ложная тревога, все с генерацией DDS у меня было в порядке. Виной действильно была настройка предискретиации в том ЦАпе, на кторый шел мой DDS. Сдела таки-же как в том на кторый шло с компа - стало прекрасно! Даже лучше, чем у той программы - у нее алис -90 а у меня -120дБ.
  2. А вот это мысль! Хотя чипы ЦАПов одинаковые, настройки могут быть разные. Проверю.
  3. Там нет настроек, кроме выбора семплрейта. Нет. Это невозможно, по вполне очевидным причинам. Да. Сделать не хуже чем делают другие. Т.е. зеркалка с уровнем -90 как дает Арта - меня устроит. (как у меня, с уровнем -20 в принципе тоже устоит, но как-то на душе не спокойно, т.к. вижу что можно лучше).
  4. ЦАП - это звуковая карта. Там ЦАП дельта-сигма с передликретизацией и естественно ФН на выходе. Но какое это имеет значение, если один и тот-же ЦАП показывает разное от двух источников ДДС-синуса? Почти. Карты физически разные, но одинаковые. Я уже раза три это описывал выше - выход двух ДДС подается на два ЦАПаЮ с них сигнал подается на 2-х канальный АЦП, с него в комп, в компе программа спектрлоанализатора. Да сколько там того кеша, целых 128 байт - как раз таблицу в него запихивать...
  5. См. выше - 48ksps это частота DDS+DAC, оцифровывается это потом АЦП на 96 или 192, потому 28 и видно :)
  6. STM32F427 Это в теории, а на практике - имеем два DDS генератора, работающие на те-же ЦАП/АЦП. Оба генерируют 20кгц при 48кгц семплирования. Оба дают алиас на 28кгц, но у первого он -90дб а у моего -20. Я тоже хочу -90, меня бы это вполне устроило.
  7. Я понимаю что работает, это далеко не первый мой программный DDS, но я раньше не генерировал частот, приближающихся к Fs/2. И очень интереснол, как-же сделали в ARTA, что у них алиас намного меньшей амплитуды?
  8. Аналогично :) Я пробовал с таблицей, расчитанной в дабл флоат, резулььтат аналогичный.
  9. Я про это и сказал, что "если считается в компайл-тайм" ОК, спасибо, попробую. У меня не залетает, во 1-х ввиду своего размера (оно вообще в ОЗУ не лезет, поэтому из феша, если не считать синус на ходу), во 2-х - ввиду отсусттвия кеша как такового.
  10. Разумеется :) Но это толко если этот расчет попадет не в ран-0тайм а в компайл-тайм. Произведение синуса на косинус? И как это поможет?
  11. Я с q31 так и делал. Это дабл, у меня проц толко с сингл FPU. Ну достаточно посмотреть в исходники arm_sin_XXX: * Computes the trigonometric sine function using a combination of table lookup * and linear interpolation. There are separate functions for * Q15, Q31, and floating-point data types. float32_t arm_sin_f32( float32_t x) { float32_t sinVal, fract, in; /* Temporary variables for input, output */ uint16_t index; /* Index variable */ float32_t a, b; /* Two nearest output values */ int32_t n; float32_t findex; /* Special case for small negative inputs */ if ((x < 0.0f) && (x >= -1.9e-7f)) { return x; } /* input x is in radians */ /* Scale the input to [0 1] range from [0 2*PI] , divide input by 2*pi */ in = x * 0.159154943092f; /* Calculation of floor value of input */ n = (int32_t) in; /* Make negative values towards -infinity */ if (x < 0.0f) { n--; } /* Map input value to [0 1] */ in = in - (float32_t) n; /* Calculation of index of the table */ findex = (float32_t) FAST_MATH_TABLE_SIZE * in; index = ((uint16_t)findex) & 0x1ff; /* fractional value calculation */ fract = findex - (float32_t) index; /* Read two nearest values of input value from the sin table */ a = sinTable_f32[index]; b = sinTable_f32[index+1]; /* Linear interpolation process */ sinVal = (1.0f-fract)*a + fract*b; /* Return the output value */ return (sinVal); } q31_t arm_sin_q31( q31_t x) { q31_t sinVal; /* Temporary variables for input, output */ int32_t index; /* Index variables */ q31_t a, b; /* Four nearest output values */ q31_t fract; /* Temporary values for fractional values */ /* Calculate the nearest index */ index = (uint32_t)x >> FAST_MATH_Q31_SHIFT; /* Calculation of fractional value */ fract = (x - (index << FAST_MATH_Q31_SHIFT)) << 9; /* Read two nearest values of input value from the sin table */ a = sinTable_q31[index]; b = sinTable_q31[index+1]; /* Linear interpolation process */ sinVal = (q63_t)(0x80000000-fract)*a >> 32; sinVal = (q31_t)((((q63_t)sinVal << 32) + ((q63_t)fract*b)) >> 32); return sinVal << 1; } Надо подумать, Я пока не очень понял. Но пока интереснее другое - беру программу, генерирующую 20кгц при 48кгц семплрейте, и сам делаю такое-же. Подаю каждый синал на свой ЦАП. Оцифровываю одновременно 2-х канальным АЦП с семплрейтом 96 или 192 (это не влияет) и смотрю спектр У них зеркалка на 28кгц с уровнем -90дБ а у меня -20дБ. Железо практичски то-же самое. Уровень 2-й гармоники примерно одинаковый, -110дБ, т.е. это не искажения ЦАП/АЦП. Чего они могут делать по другуму?
  12. В звуковых картах они имеются? Сейчас они для проверки исользуются - одна для генерации на 48кгц, другая для анализа, на 192кгц. Могу попробовать без железа, без преобращзования в аналог и обратно, на компе. Не, это было первое что я сделал - на результат не повлияло. Флоатом оказалось самое оптимальное, осенно при последующем умножении на амплитуду. Можно и не флоатом, если исползовать другую функцию - arm_sin_q31(pDDS/2), но тогда придется амплитуду менять не одним умножением, а переводом в int64 и делением на коэффициент. Про pDDS * (float)(PI / 0x80000000u) не очень понял. Зачем результат деления PI на константу переводить во флоат, если PI и так флоат и результат деления естественно тоже? Как одна выборка из таблицы может быть быстрее вычисления синуса, даже скоростными методами (в которых внутри тоже выборка из таблицы есть)? А причем тут ТК? Я-же выше Fs/2 не подымаюсь.
  13. Это практически равносильно установке отдельного стаба для VBat. К тому-же, по ТЗ проц в выключеном состоянии должден полностью отключаться, нельзя его в слипе/стопе держать.
  14. Привет. Генерирую синус DDS-ом. Не по таблице а счетом (хотя потом может перенесу и в таблицу, но пока быстордействия хватает и посчитать). На каждый семпл вызывется: data = (int32_t)( 0x7FFFFFFF * arm_sin_f32((PI*pDDS)/0x7FFFFFFF)); pDDS+=dDDS; Счетчик в аргументе (pDDS) и приращение (dDDS)- uint32_t, data - int32_t. dDDS - расчитывается заранее, в зависимости от частоты и семплрета. Все прекрасно работает, за исключением одного - в сигнале присутствует зеркалка, частотой Fsample-Fsignal, и чем Fsignal ближе к Fsample/2, тем выше ее амплитуда (с приближениек к половине семлрейта - они уже чуть ли не сравниваются). пример: Fs=48kHz, частота сигнала 20кгц - алиас на 28кгц амплитудой примерно -100дб от основной, частоа 23кгц - алиас на 25кшц с уровнем около -27дБ. Вопрос - что я делаю "не так", или оно так и должно быть? P.S. Хм, похоже так и должно быть - проверил на чужих программах, генерирующи сигналы, там тоже самое....
  15. Для еще одной батарейки нет места.