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

 
 
 
Reply to this topicStart new topic
> Вейвлет-преобразование
Cosworth
сообщение Feb 16 2014, 11:37
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-12-10
Пользователь №: 61 886



Добрый день. Разбираюсь с ДВП, для проверки написал программку в матлабе. Вейвлет - CDF(5,3), коэффициенты для LP: [-1/8, 1/4, 3/4, 1/4, -1/8], для HP: [0, -1/2, 1, -1/2, 0]. Код:
Код
function [lo, hi] = cdf_5_3(ai)
    lo = zeros(1, length(ai)/2);
    hi = zeros(1, length(ai)/2);
    k = 1;
    a = 6/8;
    b = 2/8;
    c = -1/8;
    d = 1;
    e = -1/2;
    for i = 1:2:length(ai)-4
        x(1) = ai(i);
        x(2) = ai(i + 1);
        x(3) = ai(i + 2);
        x(4) = ai(i + 3);
        x(5) = ai(i + 4);
        lo(k) = int8(a*x(3) + b*(x(2) + x(4)) + c*(x(1) + x(5)));
        hi(k) = int8(d*x(3) + e*(x(2) + x(4)));
        k = k + 1;
    end
end

Не могу понять почему, после преобразованиия получается лажа:

Слева на право: Оригинал, моя функция, матлабовская функция dwt2 (Вейвлет - Дабоши 2).
Go to the top of the page
 
+Quote Post
Cosworth
сообщение Feb 16 2014, 15:07
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-12-10
Пользователь №: 61 886



Стою я летом в лыжи обутый... cranky.gif Отлаживаюсь м матлабе по шагам:
x(1) = 155
x(2) = 155
x(3) = 155
x(4) = 154
x(5) = 155
Считаю lo(1) на бамажке: lo(1) = x(3)*(3/4) + (x(2) + x(4))*(1/4) - (x(1) + x(5))*(1/8) = 154.75
Матлаб рисует 64 wacko.gif
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Feb 16 2014, 18:01
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Тоже обул лыжи, вышел а Матлаб, посмотрел...
Код
x = 155.*ones(1, 10);
lo1 =  int8(x(3)*(3/4) + (x(2) + x(4))*(1/4) - (x(1) + x(5))*(1/8))
lo2 = uint8(x(3)*(3/4) + (x(2) + x(4))*(1/4) - (x(1) + x(5))*(1/8))
Go to the top of the page
 
+Quote Post
Cosworth
сообщение Feb 16 2014, 19:25
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-12-10
Пользователь №: 61 886



уинт работает правильно, но поменял в функции - те же вилы blink.gif
В воркспейсе массив вообще обозначен как дабл.

Все, кажись разобрался. x(1) = 155, 6*x(1)/8 = 32 - ошибка из-за переполнения int8, а вот 6*(x(1)/8) = 144. Вот за это не люблю матлаб - строгой типизации нету, зато есть грабли с ней связанные.
Go to the top of the page
 
+Quote Post
fowler
сообщение Feb 16 2014, 20:35
Сообщение #5





Группа: Участник
Сообщений: 12
Регистрация: 20-08-10
Пользователь №: 59 023



В MATLAB есть функция intwarning.
Включите вывод сообщений с помощью intwarning('on') и MATLAB будет выдавать предупреждения при переполнении.
Go to the top of the page
 
+Quote Post
Cosworth
сообщение Feb 17 2014, 09:45
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-12-10
Пользователь №: 61 886



Спрошу тут, чтобы темы не плодить. Вот есть у меня переменная uint8. В матлабе по умолчанию используется режим насыщения при переполнении (т.е 200+100=255). Можно ли какими настройками сделать по-человечески чтобы 200+100=44 ?
Go to the top of the page
 
+Quote Post
fowler
сообщение Feb 18 2014, 12:36
Сообщение #7





Группа: Участник
Сообщений: 12
Регистрация: 20-08-10
Пользователь №: 59 023



Сдается мне, что в актуальных версиях MATLAB таких настроек нет. Если по человечески - надо переопределять функции класса uint8 и учитывать при операциях возможность переполнения (т.е. после сложения двух целых берем по модулю 256 (функция mod)).
Для типов, кратных 16-битному слову - можно использовать 'fixed-point toolbox'. В help смотреть функции fi и ufi.

И еще, прощу прощения, но я ошибся. Попробовал на работе - в текущих версиях MATLAB уже нет функции intwarning.

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th August 2025 - 00:01
Рейтинг@Mail.ru


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