ADSP-BF533, проблемы с разделением сигнала

W

Wojtek

Guest
Привет всем! Я работаю на гитаре в силу в ADSP-BF533 EZ-KIT Lite, и у меня есть проблема с обработкой входящих образцов: С выхода я беру целое число, а затем преобразовать ее плавать простым "sample_float = (поплавок ) sample_int;, после этого я обработки образца и преобразовать его обратно в целое так же и отправить его на выходе. Проблема в том, что, когда я пытаюсь умножить образца любое значение меньше 1, то это приводит к искажениям. Я стараюсь иметь дело с этим в течение нескольких недель, но я не могу думать ни о чем. Я знаю, Blackfin процессоры с фиксированной точкой архитектуры и было бы легче перейти на SHARK процессор, но это невозможно, он должен быть ADSP-BF533. Есть ли способ сделать это в любом случае? Надеюсь, я дал вам достаточно информации о моем проекте, если нет, пожалуйста, дайте мне знать, что другой информации Вы должны помочь мне найти решение, это очень важно для меня. С уважением! Wojte
 
Привет Wojte, Вы программируете на C? Если преобразовать обратно с плавающей точкой в ​​целое без другой обработки, есть еще искажения? Вы можете разместить фрагмент кода? С уважением Z
 
Привет Зорро, я программирования на языке C. Если я просто конвертировать выборки из Int плавать, а затем снова с плавающей точкой в ​​целое, не изменяя его значение, нет искажений. Я могу умножить например, 2, проблема только тогда, когда я пытаюсь умножить образца нечто меньшее, чем 1. Даже если я пропущу преобразовании плавать и попытаться умножить целое образца 0.5 (или разделить на 2), по оси Z искажения. Мой код очень прост, если вы используете VisualDSP + +, он основан на проекте Например C_Talkthrough_I2S. Каждый новый образец на входе вызывает прерывание функции process_data () называется. Это оригинальный process_data () функции:
Code:
 пустота process_data (недействительными) {iChannel0LeftOut = iChannel0LeftIn; iChannel0RightOut = iChannel0RightIn; iChannel1LeftOut = iChannel1LeftIn; iChannel1RightOut = iChannel1RightIn;}
Это функция с моими изменениями:
Code:
 пустота process_data (недействительными) {float образца, образец = (поплавок) iChannel1RightIn / / есть только один канал, я использую пример * = 0.5f; / / без этой линии все в порядке iChannel1RightOut = (INT) образца;}
С уважением, Войтек
 
Привет Войтек код выглядит нормально. iChannel1RightIn и iChannel1RightOut объявлены как тип INT, не так ли? Вы уверены, что ваш уровень сигнала достаточно? Я имею в виду, что это не так слаба, что, например, она охватывает только 2 бита, а потери младший бит (например, когда вы делите на 2) тебе сигнал становится все более заметно искажены. С уважением Z
 
Привет, уровень сигнала должно быть хорошо, когда я отобразить значение iChannel1RightIn/Out в окно отладки, это от 0 до 0xFFFFFF9. Умножение на 0,9 и вызывает искажения, так что это не проблема, я думаю. Я связался с аналогового процессора устройства поддержку и описаны мои проблемы, я получил следующий ответ:
Blackfin процессор позволяет только преобразование между дробными и значения с плавающей точкой. Есть также встроенные функции, доступные для различных типов формата conversions.The заголовка файла float.h определяет свойства данных с плавающей точкой типа осуществляется компилятором. Вы можете найти более подробную информацию об этом в руководстве которого компилятор ссылка: С уважением, Войтек
 
[QUOTE = Войтек, 951 066], когда я отобразить значение iChannel1RightIn/Out в окно отладки, это от 0 до 0xFFFFFF9 [/QUOTE] Вы имеете в виду, что она колеблется от 0 до -7.? Или в десятичной системе есть значения + / - сотни по крайней мере? С уважением Z
 
Это было бы странно, когда я его отображения в десятичной это 16 777 209, образец превращается в плавающий имеет то же значение и диапазон от 0 до 16 777 209, так что я не уверен, есть ли отрицательные значения. Лучший! Войтек
 
Десятичное значение 16 777 209 соответствует шестнадцатеричное 0xFFFFFF9, но интерпретировать как неподписанных . Вы должны использовать подписал арифметики. iChannel1RightIn должен быть объявлен как Int (например, знаковое целое ). Пожалуйста, проверьте ее тип во всех местах, она была объявлена. С уважением Z
 
Привет, iChannel1RightIn объявлен как Int . Лучший! Войтек
 
Привет Войтек, странно. Может быть то, как отображаются значения? В этом случае вы должны получить только очень маленькие или очень большие цифры. Означает ли это случиться? Если в вашем коде показано на сообщение # 3, а именно: пример = (поплавок) iChannel1RightIn / / есть только один канал, я использую пример * = 0.5f; / / без этой линии все в порядке iChannel1RightOut = (INT) образца ; отображать iChannel1RightOut, какие ценности вы получаете? С уважением Z
 
Привет! Когда я отображать iChannel1RightOut значение после деления образца на 2 я получаю половину iChannel1RightIn, так и должно быть в порядке, проблемы со звуком. Лучшее, Войтек
 
Привет, я имею в виду: для примера рассмотрим iChannel1RightIn является 0xFFFFFF9 (эквивалент 16777209 беззнаковое десятичное или -7 подписан). Если вы разделите его на 2 результат либо десятичное 8388604 = 0x7FFFFC (если это считается переменной без знака до разделения) или десятичной -3 = 0xFFFFFD (если он считается подписанным). В первом случае, как это принято подписан (после деления) имеет большой ошибкой и в результате имеет очень высокий уровень и искажений. С уважением Z
 
Привет, простите поздний мой ответ - я должен был сосредоточиться на чем-то другом на некоторое время. Я попытался объявить образцах неподписанных Int и Int (если нет другого способа сделать это), но это не важно - каждый раз, когда искажения на выходе. Мой профессор предположил, что проблема может быть в переходе от Int плавать. Я использую простой (извините, но я не знаю, английское название этой операции) float_input = (поплавок) int_input; (...) int_output = (INT) float_input; Есть ли другой способ преобразования между Int и плавать? Я только нашел библиотеки функции для преобразования между поплавком и fract, но я не могу найти ничего о преобразовании между Int и плавать. Лучший! Войтек
 
Привет Войтек,
Я использую простой (извините, но я не знаю, английское название этой операции) float_input = (поплавок) int_input; (...) int_output = (INT) float_input,
Этот способ преобразования типа называют «литой» или «литье». Он должен работать. Она является частью стандарта языка C и вызывает определенные функции в случае необходимости. С уважением Z
 
Привет, проблема решена, спасибо за ваши советы. Проблема была в том, что входящие образцов от 0 до FFFFFF (24 б), и я должен был преобразовать его в 32 б. Я начинаю 8 бит влево и бросил его плавать. После этого я в состоянии выполнять все необходимые операции. Наконец я бросил поплавок образца к типу int и перейти 8 бит вправо. Это очень просто. Если бы я думал об этом несколько месяцев назад .. Спасибо за вашу помощь Z!
 

Welcome to EDABoard.com

Sponsor

Back
Top