Взятие исходных отсчётов при передискретизации

bigo
Сообщения: 6
Зарегистрирован: 25 июн 2011, 20:35

Взятие исходных отсчётов при передискретизации

Сообщение bigo » 29 июн 2011, 06:25

Помогите пожалуйста с алгоритмом. Проблема в следующем.
Хочу написать ресамплер на базе модифицированного фильтра Фарроу 3-го порядка для больших файлов (более 2 ГГб).
Считываю блоками файл и вот тут возник вопрос, как быть из расчётом индекса исходного сигнала.
Пример
считываю отсчёты в буфер, например с размерностью в 10 ячеек. если индекс исходного сигнала равен j=4,
проблем нет, так ка для расчёта коэффициентов нужно будет 4,5,6 и 7 отсчёты, а вот если j = 8,
тогда для расёта коэфициентов уже надо будет 8,9,10 и 11 отсчёты, а в массиве 10.
Соответственно нужно считать следующий блок из файла, и вот тут то и проблема.
Если считать следующий блок то затрутся предыдущие отсчёты, а они нужны будут потом, для счётов в последующем.

Если не ясно обрисовал проблему, укажите что именно не ясно. Попробую как то объяснить другими словами. Спасибо.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 768
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Взятие исходных отсчётов при передискретизации

Сообщение Бахурин Сергей » 29 июн 2011, 07:14

ну как бы так или иначе а весь блок надо обновлять каждый такт, потому что ресамплинг дает приемлемые результаты только когда момент времени попадает между -1 и 0. Если файл большой, то просто вычитывайте из него 4 значения, которые сдвигайте по мере того как это необходимо

bigo
Сообщения: 6
Зарегистрирован: 25 июн 2011, 20:35

Re: Взятие исходных отсчётов при передискретизации

Сообщение bigo » 29 июн 2011, 07:37

Но таким способом будет очень медленно, так на увеличение частоты дискретизации в 2 раза с объёмом в 2 ГГб уйдёт пол дня :-).

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 768
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Взятие исходных отсчётов при передискретизации

Сообщение Бахурин Сергей » 29 июн 2011, 07:52

bigo писал(а):Но таким способом будет очень медленно, так на увеличение частоты дискретизации в 2 раза с объёмом в 2 ГГб уйдёт пол дня :-).
Ресэмплеры применяют когда надо изменить частоту дискретизации в дробное значение. Если надо в целое значение, 2 раза, то надо применять интерполяторы, они быстрее гораздо.

bigo
Сообщения: 6
Зарегистрирован: 25 июн 2011, 20:35

Re: Взятие исходных отсчётов при передискретизации

Сообщение bigo » 29 июн 2011, 07:58

А какой из них Вы порекомендуете, и где можно посмотреть алгоритм, а то я до этих пор ка то по другому представлял значение этого слова. Я понимал, что интерполятор - это восстановление сигнала в аналоговую форму по дискретным отсчётам, а ресамплер - это устройство, которое включает в себя интерполятор, и механизм вычисления и взятия новых отсчётов с новой частотой дискретизации для сигнала что восстановил интерполятор.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 768
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Взятие исходных отсчётов при передискретизации

Сообщение Бахурин Сергей » 29 июн 2011, 10:07

практически в любой книге по цос это написано. Можно посмотреть также здесь

Ivan Karamazov
Сообщения: 89
Зарегистрирован: 28 окт 2010, 22:31
Откуда: Москва

Re: Взятие исходных отсчётов при передискретизации

Сообщение Ivan Karamazov » 01 июл 2011, 23:02

[я не уверен, что смогу продолжить в приемлемом для обсуждения темпе]
Итак, мои непонятки исходного вопроса:
Прежде всего, непонятно, что значит "2 ГГб"? Т.е. это 2 * (10 ** 9) * (10 ** 9) отсчетов? Если так, то пол-дня -- не время. Особенно, если, как следует из поста, это где-то хранится и куда-то пишется; вероятно -- с конечной средней скоростью.
Что значит модифицированный алгоритм Фарроу? Т.е. речь об оптимизации http://www.dsplib.ru/content/farrow/farrow.html, рис. 7; или??
Вообще, конечно, дело вкуса -- использовать Фарроу или "интерполяцию в лоб" -- это (поправьте, если не так!!) по слабому моему разумению одно и то же, хотя, конечно, приведенный в статьях алгоритм отстригает соблазнительную самодеятельность при переходе от одного исходного отсчета к другому, равно как и дает очевидные пути оптимизации.
По-любому -- алгоритм крайне быстр и не слишком "чист" ("требования к "чистоте"" -- в смысле производства побочных гармоник -- зависят от задачи).
Сложность, на мой вкус, там же, где и сложность интерполяции "в лоб", т.е. в крейсерском режиме можно и должно попадать в интервал [-1..0]; на "краях" же (т.е. в самом начале и в самом конце) придется рассматривать все варианты, т.е. 3 шт. для 3-го порядка ([-2..-1] [-1..0] и [0..+1] ), что несколько усложняет алгоритм и снижает производительноть (последнего можно избежать оптимизацией под контекст конкретной задачи).
ps: Идея использовать http://www.dsplib.ru/content/cicid/cicid.html как основу "сколь-угодно-точной-передискретизации нравится мне очень, но попробовать пока не сподобился, к сож.
Если ваши решения вам нравятся -- это хорошие решения. И наоборот.

bigo
Сообщения: 6
Зарегистрирован: 25 июн 2011, 20:35

Re: Взятие исходных отсчётов при передискретизации

Сообщение bigo » 02 июл 2011, 00:31

1) Прежде всего, непонятно, что значит "2 ГГб"? - опечатка 2 Гб - 2 147 000 000 байт
2) Что значит модифицированный алгоритм Фарроу? - использовал фразу из именно из http://www.dsplib.ru/content/farrow/farrow.html, рис. 7
==============================
- Не совсем понял фразу "приведенный в статьях алгоритм отстригает соблазнительную самодеятельность при переходе от одного исходного отсчета к другому, равно как и дает очевидные пути оптимизации.", а также что вы имеете ввиду "последнего можно избежать оптимизацией под контекст конкретной задачи" . Если можно объясните более доходчиво.

Ivan Karamazov
Сообщения: 89
Зарегистрирован: 28 окт 2010, 22:31
Откуда: Москва

Re: Взятие исходных отсчётов при передискретизации

Сообщение Ivan Karamazov » 03 июл 2011, 02:48

Самодеятельность -- это когда по 1-му разу делаете интерполяцию (в целях передискретизации или просто чтобы кривую по точкам провести) -- возникает соблазн (давно это было, но не только у меня) "плавно" пересчитать стык интерполяции от пред. точек к следующим точкам (например, доп. линейной интерполяцией). И [якобы] снять ограничение на необходимость попадания выходного отсчета в интевал [-1..0]. Если непонятно -- изв., но я это реально (давно) пытался делать, а потом еще несколько раз встречал похожие как-бы решения.
По оптимизации -- особенно наглядно для преобразования вверх -- стоя в начале сигнала, представленного, как массив отсчетов, нет возможности попасть в интервал [-1..0], т.е. надо довольствоваться дла нескольких первых отсчетов интервалом [-2..-1]: равно как в конце такого сигнала/массива придется учитывать необходимость работать в [0..1]. Это создает 3 ветки в алгоритме вметсто одной; с соотв. условиями для каждого отстета. Что слегка снижает производительность для основной части отсчетов. Обычно это снижение производительности игнорируют.
Если ваши решения вам нравятся -- это хорошие решения. И наоборот.

bigo
Сообщения: 6
Зарегистрирован: 25 июн 2011, 20:35

Re: Взятие исходных отсчётов при передискретизации

Сообщение bigo » 03 июл 2011, 07:16

Спасибо за разъяснение, теперь стало понятно

Ответить

Кто сейчас на конференции

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