|
|
  |
Преобразование формата при записи в файл в матлабе? |
|
|
|
Sep 8 2008, 11:34
|

Частый гость
 
Группа: Участник
Сообщений: 122
Регистрация: 13-09-06
Пользователь №: 20 353

|
Цитата(Alex65111 @ Sep 8 2008, 13:46)  В матлабе необходимо сохранить результат вычислений в файле в другом формате. Делаю так
fwrite(fid,x,'double=>int32')
но матлаб матерится. Как правильно должно быть? Попробуете вот так: fwrite(fid,x,'int32') только если х не целое, дробная чать отсечется. вам это нужно?
|
|
|
|
|
Sep 8 2008, 12:30
|

Частый гость
 
Группа: Участник
Сообщений: 122
Регистрация: 13-09-06
Пользователь №: 20 353

|
Цитата(Alex65111 @ Sep 8 2008, 16:18)  Как Вы предложили уже попробовал, в принципе получилось, но что-то округление слишком сумашедшее получилось.
При проектировании фильтров с фиксированной разрядностью, при разрядности в 32бита получается характеристика ничем не хуже чем при double, а здесь при сохранении массива, представленного в double в формате int32 (или int64) почему то происходит очень сильное искажение (загрубление). Вам нужно пронормировать массив "Х". Для этого Вам нужно домножить его на соответствующюю степень двойки. Например если хотите точность 8 бит после запятой, то fwrite(fid,x*2.^8,'int32'). Коэффициент нормировки зависит от степени точности которую хотите достич. Немое конешно дело, но зачем Вам бинарник писать? можно воспользоваться функцией "dlmwrite('Имя файла',X)", внекоторых случаях удобнее, и никакого fopen ненадо.
|
|
|
|
|
Sep 8 2008, 13:28
|

Частый гость
 
Группа: Участник
Сообщений: 122
Регистрация: 13-09-06
Пользователь №: 20 353

|
Цитата(Alex65111 @ Sep 8 2008, 17:09)  Блин, совсем забыл про нормировку!, все встало на место, сэнкс!!!
Если можно, то еще один вопрос в догонку
Есть код типа q=quantizer([32 3],'float'); yq=quantize(q,x);
В этом коде параметры quantizer могут быть "любые". Как при таком разнообразии q можно осуществить бинарную запись в файл переменной yq, когда у fwrite типов данных ограничено? В бинарник пишутся только целые числа. Как бы Вы до этого их не проквантовали перед записью в бинарный файл, чтобы не потерять информацию Вы должны их сделать целыми, пронормировать. Тоесть привести к одному из целочисленных типов данных int8, int32 и тд. Иначе все, что стоит правее запятой отсечется. Я ответил на Ваш вопрос?
Сообщение отредактировал sheh - Sep 8 2008, 13:29
|
|
|
|
|
Sep 8 2008, 13:33
|
Частый гость
 
Группа: Участник
Сообщений: 141
Регистрация: 25-10-07
Пользователь №: 31 729

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

Частый гость
 
Группа: Участник
Сообщений: 122
Регистрация: 13-09-06
Пользователь №: 20 353

|
Цитата(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 (бит знака я не учитывал). иначе достаточно простого домножения на степень двойки.
|
|
|
|
|
Sep 10 2008, 05:49
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 15-03-05
Пользователь №: 3 379

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

Частый гость
 
Группа: Участник
Сообщений: 122
Регистрация: 13-09-06
Пользователь №: 20 353

|
Цитата(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), может перестать работать. Так же важно насколько Вам будет потом удобно работать с этими числами.
Сообщение отредактировал sheh - Sep 11 2008, 06:03
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|