Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Преобразование формата при записи в файл в матлабе?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Математика и Физика
Alex65111
В матлабе необходимо сохранить результат вычислений в файле в другом формате. Делаю так

fwrite(fid,x,'double=>int32')

но матлаб матерится. Как правильно должно быть?
sheh
Цитата(Alex65111 @ Sep 8 2008, 13:46) *
В матлабе необходимо сохранить результат вычислений в файле в другом формате. Делаю так

fwrite(fid,x,'double=>int32')

но матлаб матерится. Как правильно должно быть?


Попробуете вот так:
fwrite(fid,x,'int32')

только если х не целое, дробная чать отсечется.
вам это нужно?
Alex65111
Как Вы предложили уже попробовал, в принципе получилось, но что-то округление слишком сумашедшее получилось.

При проектировании фильтров с фиксированной разрядностью, при разрядности в 32бита получается характеристика ничем не хуже чем при double, а здесь при сохранении массива, представленного в double в формате int32 (или int64) почему то происходит очень сильное искажение (загрубление).
sheh
Цитата(Alex65111 @ Sep 8 2008, 16:18) *
Как Вы предложили уже попробовал, в принципе получилось, но что-то округление слишком сумашедшее получилось.

При проектировании фильтров с фиксированной разрядностью, при разрядности в 32бита получается характеристика ничем не хуже чем при double, а здесь при сохранении массива, представленного в double в формате int32 (или int64) почему то происходит очень сильное искажение (загрубление).


Вам нужно пронормировать массив "Х".
Для этого Вам нужно домножить его на соответствующюю степень двойки.
Например если хотите точность 8 бит после запятой, то fwrite(fid,x*2.^8,'int32').
Коэффициент нормировки зависит от степени точности которую хотите достич.

Немое конешно дело, но зачем Вам бинарник писать?
можно воспользоваться функцией "dlmwrite('Имя файла',X)", внекоторых случаях удобнее, и никакого fopen ненадо.
Alex65111
Блин, совсем забыл про нормировку!, все встало на место, сэнкс!!!

Если можно, то еще один вопрос в догонку

Есть код типа
q=quantizer([32 3],'float'); yq=quantize(q,x);

В этом коде параметры quantizer могут быть "любые". Как при таком разнообразии q можно осуществить бинарную запись в файл переменной yq, когда у fwrite типов данных ограничено?
sheh
Цитата(Alex65111 @ Sep 8 2008, 17:09) *
Блин, совсем забыл про нормировку!, все встало на место, сэнкс!!!

Если можно, то еще один вопрос в догонку

Есть код типа
q=quantizer([32 3],'float'); yq=quantize(q,x);

В этом коде параметры quantizer могут быть "любые". Как при таком разнообразии q можно осуществить бинарную запись в файл переменной yq, когда у fwrite типов данных ограничено?


В бинарник пишутся только целые числа. Как бы Вы до этого их не проквантовали перед записью в бинарный файл, чтобы не потерять информацию Вы должны их сделать целыми, пронормировать.
Тоесть привести к одному из целочисленных типов данных int8, int32 и тд.
Иначе все, что стоит правее запятой отсечется.

Я ответил на Ваш вопрос?
Alex65111
А что тогда пишется, например, fwrite(fid, x, 'float32')?, в каком формате в файле будут данные?

И еще. У меня в массиве, полученном после обработки лежат данные в double, где максимальное значение равно 7 с копейками.
Тогда получается, что перед нормировкой я должен x/max(x)?, т.е. итого будет fwrite(fid,x/(max(x))*2^8,'int32')?
sheh
Цитата(Alex65111 @ Sep 8 2008, 17:33) *
А что тогда пишется, например, fwrite(fid, x, 'float32')?, в каком формате в файле будут данные?

И еще. У меня в массиве, полученном после обработки лежат данные в double, где максимальное значение равно 7 с копейками.
Тогда получается, что перед нормировкой я должен x/max(x)?, т.е. итого будет fwrite(fid,x/(max(x))*2^8,'int32')?


Я погорячился с тем что можно писать только целые числа. Извините, что ввел в заблуждение.
Я так понял float при записи автоматически нормируется, формат я незнаю.
Но если Вы запишите float32, а потом сделате fread(fid,x,'float32'), то получите теже числа, что и записывали. Тоеть формат вобщемто знать ненужно, главное знать какой тип Вы записывали в файл.
На счет quantizer не знаю сработает это или нет, но вобщемто несложно проверить.

По поводу нормировки.
если у Вас цель использовать полностью разрядную сетку, то Вы правы, максимальный коэф. надо сделать единицей, а затем помножить на (2^n-1). те если у Вас 8 бит, максимальное число должно быть 255 (бит знака я не учитывал).
иначе достаточно простого домножения на степень двойки.
newleshii
Подскажите пожалуйста, как правильно/эффективно/рационально выбрать формат представления и разрядность для массива данных со следующими характеристиками

Минимальное значение - 1.25
Максимальное значение - 7.57
Минимальный шаг между отсчетами (или точность представления) - 2*10^-9
sheh
Цитата(newleshii @ Sep 10 2008, 09:49) *
Подскажите пожалуйста, как правильно/эффективно/рационально выбрать формат представления и разрядность для массива данных со следующими характеристиками

Минимальное значение - 1.25
Максимальное значение - 7.57
Минимальный шаг между отсчетами (или точность представления) - 2*10^-9


Не могли бы Вы описать алгоритм в котором используются эти числа?
Возможна ли нормировка?

Например:
Х = 1.25:2*10^-9:7.57;
X = X - 1.25; - теперь минимальное значения Х нуль.
Есть возможность учесть коэффициент 1.25 в алгоритме?

Если делать "в лоб":
три бита необходимо под целую часть (при этом комбинация 000.... не будет встречаться),
Шаг в этом случае желательно выбрать равным 1/(2^n), при определенном значении n Вы получите необходимую Вам точность представления.
Таким образом получаем формат: 3:n.

Но все эти преобразования нужно приверять на практике. Если алгоритм "капризный", то после всяческих нормировок и точностей 1/(2^n), может перестать работать.
Так же важно насколько Вам будет потом удобно работать с этими числами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.