реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Преобразование формата при записи в файл в матлабе?
Alex65111
сообщение Sep 8 2008, 09:46
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 25-10-07
Пользователь №: 31 729



В матлабе необходимо сохранить результат вычислений в файле в другом формате. Делаю так

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

но матлаб матерится. Как правильно должно быть?
Go to the top of the page
 
+Quote Post
sheh
сообщение Sep 8 2008, 11:34
Сообщение #2


Частый гость
**

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



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

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

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


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

только если х не целое, дробная чать отсечется.
вам это нужно?
Go to the top of the page
 
+Quote Post
Alex65111
сообщение Sep 8 2008, 12:18
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 25-10-07
Пользователь №: 31 729



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

При проектировании фильтров с фиксированной разрядностью, при разрядности в 32бита получается характеристика ничем не хуже чем при double, а здесь при сохранении массива, представленного в double в формате int32 (или int64) почему то происходит очень сильное искажение (загрубление).
Go to the top of the page
 
+Quote Post
sheh
сообщение Sep 8 2008, 12:30
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 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 ненадо.
Go to the top of the page
 
+Quote Post
Alex65111
сообщение Sep 8 2008, 13:09
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 25-10-07
Пользователь №: 31 729



Блин, совсем забыл про нормировку!, все встало на место, сэнкс!!!

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

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

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

Сообщение отредактировал Alex65111 - Sep 8 2008, 13:10
Go to the top of the page
 
+Quote Post
sheh
сообщение Sep 8 2008, 13:28
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Alex65111
сообщение Sep 8 2008, 13:33
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
sheh
сообщение Sep 8 2008, 14:34
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 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 (бит знака я не учитывал).
иначе достаточно простого домножения на степень двойки.
Go to the top of the page
 
+Quote Post
newleshii
сообщение Sep 10 2008, 05:49
Сообщение #9


Участник
*

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



Подскажите пожалуйста, как правильно/эффективно/рационально выбрать формат представления и разрядность для массива данных со следующими характеристиками

Минимальное значение - 1.25
Максимальное значение - 7.57
Минимальный шаг между отсчетами (или точность представления) - 2*10^-9
Go to the top of the page
 
+Quote Post
sheh
сообщение Sep 11 2008, 06:00
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 23:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01423 секунд с 7
ELECTRONIX ©2004-2016