Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ограничение амплитуды
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
shf_05
необходимо ограничить по амплитуде синус(затем и произвольный сигнал) (например по уровню X), далее он фильтруется и проч., в итоге получаем его огибающую.
- это предельно прозрачно, если сигнал один, скажем sin(1000Гц) или случ. сигнал, как быть для квадратурного с-ла?
можно для sin ограничить отдельно Re и Im, вроде в этом случае все будет корректно, будет ли все корректно для произвольного сигнала?
можно конечно повыводить формулы, помоделить, надеюсь кто-нить скажет "с ходу", поделитесь опытом.
petrov
Цитата(shf_05 @ Nov 10 2008, 14:16) *
необходимо ограничить по амплитуде синус(затем и произвольный сигнал) (например по уровню X), далее он фильтруется и проч., в итоге получаем его огибающую.
- это предельно прозрачно, если сигнал один, скажем sin(1000Гц) или случ. сигнал, как быть для квадратурного с-ла?
можно для sin ограничить отдельно Re и Im, вроде в этом случае все будет корректно, будет ли все корректно для произвольного сигнала?
можно конечно повыводить формулы, помоделить, надеюсь кто-нить скажет "с ходу", поделитесь опытом.


Нет не корректно ограничивать квадратуры отдельно, надо переводить в полярные координаты, заменять амплитуду на константу, затем обратно в декартовы.
shf_05
т.е. сделать sat(Ampl)*(cos(phi)+i*sin(phi))?
можн как нибудь попроще- ведь на дсп вычислять tan, atan, sin, cos оччень нехочется.
petrov
Цитата(shf_05 @ Nov 10 2008, 14:39) *
т.е. сделать sat(Ampl)*(cos(phi)+i*sin(phi))?
можн как нибудь попроще- ведь на дсп вычислять tan, atan, sin, cos оччень нехочется.


Не вижу никаких сложностей в вычислении аргумента комплексного числа, кстати для каких вам целей, может и нет нужды обратно в квадратуры переходить?
shf_05
соложность в том, что вычислять аргумент надо в режиме РВ, на медленном проце.
далее квадратуры фильтруются, и вычисляется их огибающая.
alex_os
Цитата(shf_05 @ Nov 10 2008, 14:58) *
соложность в том, что вычислять аргумент надо в режиме РВ, на медленном проце.
далее квадратуры фильтруются, и вычисляется их огибающая.

Если фазу считать не хочется можно так :
Код
s = x+1j*y; // входной сигнал
tmp = x^2 + y^2;
if( tmp>A^2 ) // A - порог ограничения
{
    y = s * A/sqrt(tmp)  // Ограниченный выходной сигнал
}
else
{
   y = s;
}
shf_05
+1 )))
это эквивалентно ограничению амплитуды и умножению на фазу

зы: раньше я и делить не хотел теперь все-таки видимо придется
petrov
Цитата(shf_05 @ Nov 10 2008, 14:58) *
соложность в том, что вычислять аргумент надо в режиме РВ, на медленном проце.
далее квадратуры фильтруются, и вычисляется их огибающая.


А смысл ограничения в чём?
shf_05
Цитата(petrov @ Nov 10 2008, 17:17) *
А смысл ограничения в чём?


очень приблизительно- система ШОУ
важна эквивалентность ограничения квадратурного с-ла неквадратурному в спектральной области.

вот протестил:

clear

a= 3;
s= 2*hilbert(randn(1,100));
t= 1:length(s);

s1= s;
s1(abs(s)>3)= s(abs(s)>3)./(abs(s(abs(s)>3)))*a;

s2_a= (abs(s));
s2_a(s2_a>a)= a;
s2_r= s2_a.*cos(angle(s));
s2_im= s2_a.*sin(angle(s));
s2= s2_r+i*s2_im;

figure(1)
plot(t,real(s1),'r',...,
t,abs(s1),'m',...
t,real(s2),'b',...
t,abs(s2),'k'),
plotbrowser('on')

figure(2)
plot(t,abs(s1)-abs(s2),'b')


вроде все чисто
alex_os
Цитата(shf_05 @ Nov 10 2008, 15:14) *
+1 )))
это эквивалентно ограничению амплитуды и умножению на фазу

зы: раньше я и делить не хотел теперь все-таки видимо придется

Лучше не делить а сделать 1/sqrt(x), вроде есть куча алгоритмов которые это довольно быстро считают...
shf_05
Цитата(alex_os @ Nov 11 2008, 17:06) *
Лучше не делить а сделать 1/sqrt(x), вроде есть куча алгоритмов которые это довольно быстро считают...

с этого и начиналась тема, подскажите направление поиска хоть
alex_os
Цитата(shf_05 @ Nov 12 2008, 08:39) *
с этого и начиналась тема, подскажите направление поиска хоть

Например вот
shf_05
понятно, в моем варианте sqrt находится по ф-ле тейлора (6 коэф-в) тактов 20, далее деление, занимающее 16 тактов.
а можно сразу придумать ряд, аппроксимирующий 1/sqrt.
alex_os
Цитата(shf_05 @ Nov 12 2008, 10:33) *
понятно, в моем варианте sqrt находится по ф-ле тейлора (6 коэф-в) тактов 20, далее деление, занимающее 16 тактов.
а можно сразу придумать ряд, аппроксимирующий 1/sqrt.

А что за процессор который так удачно делить умеет (за 16 тактов) ?
shf_05
Цитата(alex_os @ Nov 12 2008, 12:48) *
А что за процессор который так удачно делить умеет (за 16 тактов) ?

adsp2191 16 тактов на одно деление, дак вроде и тмс тоже за 16 делит, а впоследнем до кучи есть встроенная инструкция sqrt.

вот пример, на самом деле чуть больше 16
//sr1- divider
//ay0- result
ay0= 0; // 16 LSB of numerator
ay1= mx0; // 16 MSB of numerator- I data
DIVS AY1, sr1;
DIVQ sr1;
DIVQ sr1; DIVQ sr1;
DIVQ sr1; DIVQ sr1;
DIVQ sr1; DIVQ sr1;
DIVQ sr1; DIVQ sr1;
DIVQ sr1; DIVQ sr1;
DIVQ sr1; DIVQ sr1;
DIVQ sr1; DIVQ sr1;
mx0= ay0; // I/abs(I+i*Q)
alex_os
Цитата(shf_05 @ Nov 12 2008, 10:52) *
adsp2191 16 тактов на одно деление...

Дык, могучий процессор можно что угодно считать, я чего-то думал что у Вас какой-то АRM или еще какой-нибудь микроконтроллер, поэтому удивился что деление за 16 тактов получается.
shf_05
Цитата(alex_os @ Nov 12 2008, 13:04) *
Дык, могучий процессор можно что угодно считать, я чего-то думал что у Вас какой-то АRM или еще какой-нибудь микроконтроллер, поэтому удивился что деление за 16 тактов получается.

все равно тактов жалко... в мою задачу с наааатяжкой хватает
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.