Вверх ↑
Этот топик читают: Гость
Ответов: 8927
Рейтинг: 823
#16: 2013-08-17 11:55:29 ЛС | профиль | цитата
rolin, вот, что хотел показать:
code_31607.txt
как без строк извлекать и обрабатывать семплы.
Кстати: на BASS_StreamCreate можно подавать данные не только в формате SmallInt, но и Integer, и Double, Real но с амплитудным значением не более +-32767
------------ Дoбавленo в 11.55:
Перетащить *.ini файл на поле HiAsm, в окошке выбрать нужное расположение и Ok, перезагрузить HiAsm и компонент засветиться, аж глазам больно
putelement.jpg
карма: 19

0
файлы: 2code_31607.txt [961B] [165], putelement.jpg [93.2KB] [439]
Ответов: 91
Рейтинг: 1
#17: 2013-08-17 14:00:09 ЛС | профиль | цитата
так что, я могу подать свои 3-х байтные сэмплы, а обработаются только 2-х байтные уровни? Это может сработать.
Только вот не могу убрать первые 2 байта, они не сэмплы. На выходе ничего нет. На входе поток в виде строк.
code_31609.txt

карма: 1

0
файлы: 1code_31609.txt [770B] [139]
Ответов: 8927
Рейтинг: 823
#18: 2013-08-17 15:04:04 ЛС | профиль | цитата
rolin писал(а):
могу подать свои 3-х байтные сэмплы

Леонид писал(а):
но с амплитудным значением не более +-32767
В трёхбайтных максимальное значение за 8000000, их надо делить на 256 (или сдвигать на 8 бит)
Весь поток разбит на части и перед каждой эти 2 не звуковых байта, или они только в начале первой части?
карма: 19

0
Ответов: 91
Рейтинг: 1
#19: 2013-08-17 15:24:34 ЛС | профиль | цитата
чет у меня ничего не получается. Буфер не всегда заполняется данными, я не знаю что он хочет. И я не знаю как работает DataToFaile.

Объясню проблему. Мой HIQSdR передает по UDP кадры, которые состоят из х х л л л п п п л л л п п п итого 1442 байта.
Первые 2 байта ничего не значат, остальные 1440 байт - чередующиеся 3-х байтные сэмплы левый и правый.
Я думаю, что
1 первые 2 надо убрать из кадра
2 убирать каждый третий байт, делая таким образом 2-х байтные сэмплы
3 подавать это в буфер и проигрывать.
карма: 1

0
Ответов: 8927
Рейтинг: 823
#20: 2013-08-18 11:07:33 ЛС | профиль | цитата
rolin, правильно заданый вопрос содержит 90% ответа, с этого надо и начать было
DataToFaile на каждый клик читает (записывает) и преобразует N количество байт (определяется выбранным свойством) с места, где находится указатель, указатель передвигается на это количество байт.
Чуть позже набросаю схемку примера.
------------ Дoбавленo в 11.07:
rolin, вот получилось, но неправильно, при подаче 200 "кадров" в секунду вываливается при 100 кадрах работает Вчера часа два затылок чесал, чего-то я недопонимаю в этих файловых потоках

Add(MainForm,2953706,266,266)
{
Height=111
Caption="Rolin"
Point(Handle)
link(onCreate,14871690:doInit,[(305,286)(305,272)])
}
Add(Button,15834607,266,105)
{
Left=10
Top=5
Caption=">>"
link(onClick,11971739:doStart,[])
}
Add(MultiElementEx,15807770,364,105)
{
@Hint=#134:Иммитатор SDR, выдаёт кадры по 1442 байта, первые 2 нулевые, остальные содержат 24-битные Sin и Cos 1000 Гц при 48000 Гц дискретизации|
link(onStrm,2552183:doEvent1,[])
}
BEGIN_SDK
Add(EditMultiEx,11645957,21,21)
{
WorkCount=#6:doStrm|
EventCount=#32:onStrm=Выдаёт поток из 1442 байт|
Width=419
Height=277
link(doStrm,9982970:doEvent1,[(46,27)(46,153)])
}
Add(DataToFileEx,7182087,336,119)
{
DataSize=3
Signed=0
BigEndian=0
link(Stream,6066762:Var2,[])
}
Add(MemoryStream,15327036,336,49)
{
}
Add(Hub,225577,196,161)
{
link(onEvent1,5284807:doOperation,[])
link(onEvent2,7995971:doOperation,[(221,174)(221,216)])
}
Add(For,1419073,98,161)
{
End=239
link(onEvent,10518159:doOperation,[])
link(onStop,4449329:doData,[(137,174)(137,251)])
}
Add(Hub,9982970,56,147)
{
OutCount=3
link(onEvent1,15327036:doClear,[(81,153)(81,62)])
link(onEvent2,13573717:doData,[(88,160)(88,125)])
link(onEvent3,1419073:doFor,[])
}
Add(DataToFile,10935020,147,119)
{
Type=1
link(Stream,6066762:Var1,[(153,103)])
}
Add(GetDataEx,6066762,336,98)
{
link(Data,15327036:Stream,[])
}
Add(DoData,13573717,98,119)
{
Data=Integer(0)
link(onEventData,10935020:doPut,[])
}
Add(Math,10518159,147,161)
{
OpType=2
Op2=0.130899693899575
link(onResult,225577:doEvent1,[])
}
Add(Math,5284807,231,161)
{
OpType=13
link(onResult,7824963:doOperation,[])
}
Add(Math,7995971,231,210)
{
OpType=12
link(onResult,13082787:doOperation,[])
}
Add(Math,13082787,280,210)
{
OpType=2
Op2=8388600
ResultType=0
link(onResult,7976762:doWork3,[(326,216)])
}
Add(Math,7824963,280,161)
{
OpType=2
Op2=8388600
ResultType=0
link(onResult,7976762:doWork2,[])
}
Add(HubEx,7976762,322,161)
{
Angle=3
link(onEvent,7182087:doPut,[(326,132)])
}
Add(DoData,4449329,364,245)
{
link(onEventData,11645957:onStrm,[(403,251)(403,27)])
link(Data,6066762:Var3,[(370,103)])
}
END_SDK
Add(Thread,11971739,315,105)
{
Delay=10
link(onExec,15807770:doStrm,[])
}
Add(Button,3126444,266,147)
{
Left=10
Top=35
Caption="II"
link(onClick,11971739:doStop,[(305,153)(305,118)])
}
Add(BASS_Init,14871690,315,266)
{
Freq=48000
link(onInit,10183901:doCheck,[])
link(onError,11232751:doMessage,[])
link(Handle,2953706:Handle,[(335,257)(258,257)(258,306)(272,306)])
}
Add(BASS_StreamCreate,5785541,567,266)
{
Freq=48000
Channels=2
Name="MySDR"
link(onCreate,11772076:doPlay,[])
link(Data,7526552:Data,[])
}
Add(SoundBuffer,920753,497,63)
{
}
Add(DataToFileEx,7526552,567,217)
{
DataSize=3
Signed=0
BigEndian=0
Point(doPosition)
link(Stream,13545473:Stream,[])
}
Add(Hub,2552183,413,105)
{
OutCount=5
link(onEvent1,1110172:doCopy,[(438,111)(438,55)])
link(onEvent2,920753:doAdd,[(445,118)(445,69)])
link(onEvent3,14651797:doCopy,[(486,125)(486,118)])
link(onEvent4,6180934:doData,[])
link(onEvent5,4392974:doCopy,[(438,139)(438,174)])
}
Add(DoData,6180934,448,126)
{
Data=Integer(2)
link(onEventData,14651797:doPosition,[])
}
Add(BASS_ChannelPlay,11772076,616,266)
{
Channel="MySDR"
}
Add(BASS_Version,10183901,399,266)
{
link(onCheckOk,5785541:doCreate,[])
link(onCheckFailed,109118:doMessage,[])
}
Add(Message,11232751,357,273)
{
Message="Error BASS initialization"
Caption="Error"
Icon=1
}
Add(Message,109118,441,273)
{
Message="Incorrect version of BASS library "
Caption="Error"
Icon=1
}
Add(MemoryStream,14651797,497,112)
{
Point(doPosition)
link(SrcStream,920753:Stream,[])
}
Add(DoData,1257513,672,217)
{
link(onEventData,11128013:doPosition,[])
link(Data,13545473:FullState,[(678,208)(580,208)])
}
Add(StreamCopy,4392974,490,168)
{
Count=1440
link(onCopy,13545473:doAdd,[])
link(Dest,5632447:Var1,[(496,155)])
link(Source,14651797:Stream,[])
}
Add(ProgressBar,11128013,721,217)
{
Left=85
Top=20
Width=215
Height=10
Color=32768
ProgressColor=65280
}
Add(SoundBuffer,13545473,567,168)
{
link(SoundStream,5632447:Var3,[(573,155)])
}
Add(MemoryStream,1110172,546,49)
{
}
Add(Timer,7664329,630,217)
{
Interval=30
link(onTimer,1257513:doData,[])
}
Add(GetDataEx,5632447,546,150)
{
link(Data,1110172:Stream,[])
}
Add(Math,7288998,462,217)
{
OpType=3
Op2=256
link(onResult,10056068:doData,[])
}
Add(EventFromData,10056068,504,217)
{
}
Решил плюнуть на "ни строчки кода" и сделать IC к вечеру выложу.
карма: 19

0
Ответов: 91
Рейтинг: 1
#21: 2013-08-18 14:50:21 ЛС | профиль | цитата
Вот-вот. Мои схемы хоть и не такие изящные, но результат тот же, пара секунд явно неправильной работы и вылет при опустошении буфера.
Глядя на наполнение буфера, сразу понятно - это не работа. А ведь примерчики красиво работают!
карма: 1

0
Ответов: 8927
Рейтинг: 823
#22: 2013-08-19 16:23:42 ЛС | профиль | цитата
rolin, с IC получается без зависания и на моём компьютере (3200 МГц, Win7) 3-4% загрузки
Пытайте, может и подойдёт
карма: 19

0
файлы: 1rolinic.rar [5.4KB] [93]
Ответов: 91
Рейтинг: 1
#23: 2013-08-19 20:00:19 ЛС | профиль | цитата
Спасибо огромное за помощь. Испытал.
В Вашем примере - звук рвется, заполнение буфера не показывает, загрузка моего слабачка 40%

Удалил лишнее и вставил в свою схему. Результат - звук рвется, заполнение буфера не показывает, уровень показывает максимум, SDR программа видит
хаотичный шум максимального уровня, индикация номера кадра отрабатывает четко 0 -255 и по кругу. Загрузка 20%

Установил в элементе BASS_stream один канал вместо 2, буфер стал заполнятся, звук не рвется.

Мой вывод - неправильная обработка кадра.
формировал поток так
code_31622.txt
Если я могу как-то помочь выявить ошибку?
Информация о протоколе здесь https://docs.google.com/file/d/0BzuiSb2tJSbzZFUwWEpIQlFGUWs/edit?usp=sharing
карма: 1

0
файлы: 1code_31622.txt [398B] [141]
Ответов: 8927
Рейтинг: 823
#24: 2013-08-20 08:56:19 ЛС | профиль | цитата
rolin, вывод рано делать
Стервецы из приведённой ссылки в тексте заменили "fi" на что-ли картинки, при копировании текст рвётся
The received samples are carried by UDP frames with a total fixed payload size of 1442 bytes. Each sample consists of 3 Bytes I and 3 Bytes Q data. They are interleaved. The first byte of each UDP frame carries a sequence number that is incremented from frame to frame. It can be used to identify a loss of UDP messages during reception. The second byte is used for signalling the current status of the reception. Bit 0 is used as Key indication. If it is 0 the PTT is issued and if it is 1 the PTT is not active. Bit 1 indicates clipping of the ADC (overrange). The data format of the samples is little endian (least significant byte first) with real words at the odd (first) positions and the imaginary words at the even (second) positions.

Полученные образцы переносятся UDP кадров с общей фиксированный размер полезной нагрузки 1442 bytes. Каждый образец состоит из 3 байтов I и 3 байта Q данных. Они чередуются. Первый байт каждого кадра UDP несет порядковый номер, который увеличивается от кадра к кадру. Он может быть использован для определения потери сообщения UDP при приеме. Второй байт используется для сигнализации текущего состояния приема. Бит 0 используется как ключ индикации. Если он равен 0 PTT выдается и, если это 1 PTT не активна. Бит 1 указывает вырезку АЦП (перегрузки). Формат данных образцов является обратным порядком байтов (младший байт) с вещественными слова в нечетные (первой) позиции и мнимые слова в четные (вторую) позиций.
------------ Дoбавленo в 00.09:
Менять стерео на моно никак нельзя, будет играть в два раза ниже.
Ошибка моя:
Строка 127: заменить _hi_OnEvent(onNextSempl, DataSound[ChanLR, 0]); на _hi_OnEvent(onNextSempl, 0);

В этих строках можно попробовать заменить b1 на b3, тогда сменится формат представления трёхбайтного числа:

Строка 63--65 и 71--73
if b1>127 then
_SoundL:=b2+b1*256-65536 //Считаем два старшие бита
else _SoundL:=b2+b1*256;

Но это попозже, сначала анализ, чего не хватает этому SDR-у
В прилагаемой схеме график заменён на StrList с сохранением в файл и количество кадров 200 (1 сек). Подключите Ваш SDR, без запуска звука, сохраните файлы и выложите архивом сюда для анализа.
------------ Дoбавленo в 08.56:
Кстати: раз производители выдают I и Q каналы на НЧ, просто слушать их бесполезно, по 24 кГц и с обеих сторон от несущей создадут такую кашу, действительно один шум будет. Надо эти каналы пропускать через Фурье, плюсовать-минусовать стобы получить отдельно и верх и низ, а уже из этой полосы в 48 кГц выбирать полосу приёма и делать с ней обратное преобразование Фурье, которое уже можно послушать
карма: 19

0
файлы: 1sdr_txt.rar [3.9KB] [86]
Ответов: 91
Рейтинг: 1
#25: 2013-08-20 23:05:30 ЛС | профиль | цитата
Леонид раз производители выдают I и Q каналы на НЧ, просто слушать их бесполезно, по 24 кГц и с обеих сторон от несущей создадут такую кашу, действительно один шум будет.

Слушать конечно там нечего, ибо уровень сигнала там несколько бит от низа. Поэтому я подключаю к другому концу виртуального аудиокабеля разные SDR проги и смотрю результат. Ловлю себя на мысли, что в последнее время именно смотрю, а слушаю только если увижу что-то интересное. Вот блин технологии, радио теперь смотрят

Данные получил, в архиве.http://forum.hiasm.com/forum_serv.php?q=56&id=3579

Я записал кадры, идущие с железа. Выглядят так ( длина каждого ограничена 40 байт)

4900A5FFFF51FFFF63FFFF89FFFF81FFFF33FFFF40FFFF58FFFF95FEFFDCFEFF85FFFFD7FEFFBBFEFF
4A00F3FEFF0EFFFF25FFFFCFFEFF9CFEFF11FFFF1EFFFF21FFFF1BFFFF23FFFF48FFFFCDFEFF49FFFF
4B0034FFFF15FFFF4EFFFFF0FEFFFFFEFF52FFFFC9FEFFFFFEFF1EFFFF43FFFF28FFFF92FFFF79FFFF
4C002FFFFF60FFFF16FFFFF0FEFF67FFFF4EFFFF9AFFFF33000027FFFF56FFFFBAFEFF25FFFFA9FEFF
4D00DBFEFF6DFFFF79FFFF0FFFFF35FFFF33FFFFF1FEFF64FFFF25FFFFDAFEFF24FFFF48FFFF87FFFF
4E0038FFFF13FFFFFBFEFF1AFFFF89FFFFCDFEFFC3FFFF4EFFFF93FFFF0C00003FFFFF15FFFFD8FEFF
4F00B1FEFFBFFFFF5CFFFF08FFFF84FFFF6EFEFFB1FFFF41FFFFABFFFFDEFFFF23FFFFEFFFFFC4FEFF
500087FFFFA8FEFF88FFFF7CFFFFF6FEFF7DFFFFA5FEFF10FFFFDAFEFFDEFEFFC2FFFFF7FEFF2A0000
51002BFFFFEEFEFF2AFFFF30FFFF2DFFFF040000C1FEFFFBFEFF24FFFF3AFEFF69FFFFC0FEFFE8FFFF
5200FEFEFF87FFFFDAFEFF42FFFFA8FFFF62FFFF57FFFFD1FFFF8AFFFF15FFFF6AFFFFD4FEFFF4FEFF
530088FEFF81FFFF12FFFF2EFFFFA6FEFF5EFFFF3AFFFF9EFEFF1AFFFFFEFEFF63FFFF87FFFFE7FEFF

Я был прав, каждый третий можно убрать.
------------ Дoбавленo в 23.05:
Щщщщщерт! А почему там FF вместо 00 ?
карма: 1

0
Ответов: 8927
Рейтинг: 823
#26: 2013-08-21 13:00:22 ЛС | профиль | цитата
rolin, да, какая-то неувязка, но судя по тому, как они текст зашифровали от копирования, не исключено, что и эти три байта (всего-то три) не стандартно отражают значение Пробовал за старший байт и первый и третий, и использовать вместо байтов их дополнения -- равно шум получается
HEX представление, что Вы выложили более информативно, запишите секунду (200 кадров) и выложите здесь архивом, попробую ещё подумать
карма: 19

0
Ответов: 91
Рейтинг: 1
#27: 2013-08-21 21:48:05 ЛС | профиль | цитата
Леонид, Текст не шифровали, такие баги известны при выдирании текста из PDF.
байты там должны быть стандартные, ибо они точно такие-же как и в SDR-IP я делал транслятор протокола.А SDR-IP это очень серьезная штука, задающая стандарты.
Короче, я погуглил http://ru.wikipedia.org/wiki/Дополнительный_код_(представление_числа)
Это обратный код. При наличие постоянного смещения в минус(а оно как раз и есть) , будет везде FF , при достаточно слабом сигнале.
А при достаточно сильном сигнале, код иногда в плюс уходит, и стает 00.
Что и подтверждается в восьмой строчке, последний сэмпл, см. мой пост выше.
Таким образом, код надо преобразовать в прямой, для подачи на звуковое устройство.
карма: 1

0
Ответов: 8927
Рейтинг: 823
#28: 2013-08-21 23:23:03 ЛС | профиль | цитата
rolin, именно так в IC и сделано, посмотрите мой предпоследний пост, для 24 битного будет выглядеть так:
If byte1>127 Then Sound := byte1*65536 + byte2*256 + byte3 - 16 777 216 Else byte1*65536 + byte2*256 + byte3;
или, если старший байт не первый, а последний:
If byte3>127 Then Sound := byte3*65536 + byte2*256 + byte1 - 16 777 216 Else byte3*65536 + byte2*256 + byte1;
Поэтому и просил выложить "..HEX представление..."
карма: 19

0
Ответов: 91
Рейтинг: 1
#29: 2013-08-22 00:48:29 ЛС | профиль | цитата
Вот, 200 кадров, HEX. http://forum.hiasm.com/forum_serv.php?q=56&id=3580
карма: 1

0
Ответов: 8927
Рейтинг: 823
#30: 2013-08-22 12:41:52 ЛС | профиль | цитата
rolin, запустил эти 200 кадров в кольце и при прямом
b1_старший.jpg
и при обратном
b3_старший.jpg
чтении значения, результат в звуке почти одинаков: ш-ш-ш-ш, шумит, зараза. Записал шум по 3 сек( в архиве) rolin_sound.rar, так и не понял, какой правильный На картинке видны формулы, я их приводил уже. Да и нагрузка процессора совсем не велика.
Надо бы найти на приёмнике (ведь приёмник-то есть, наверное) какую-либо станцию, лучше вещалку с АМ, и настроить SDR на эту частоту, записать HEX секунду-другую.
карма: 19

0
файлы: 2b1_старший.jpg [75.6KB] [352], b3_старший.jpg [72.4KB] [361]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)