Цитата(-=ВН=- @ Jun 1 2007, 12:38)

А дальше обратно все проделать (после вырезания околонулевой области). Фаза предварительно сохранена...
Не понял. В каком месте?
Цитата(-=ВН=- @ Jun 1 2007, 12:38)

...Вариант дан больше шутки ради, он трудоемок вычислительно...
Да, и мой вариант в этом смысле не слишком ахти (особенно, если сделать его итерационным). Но вычислительные возможности даже одиночных современных процессоров и ПЛИС часто оказываются достаточными для обработки сигнала в реалтайме (кусочки-то маленькие по длине). И вообще, про вычислитель автор темы приказал молчать...
Цитата(-=ВН=- @ Jun 1 2007, 12:38)

...Но вообще он рабочий, хотя естественно полной очистки не дает, да и тонкостей там хватает. Когда-то давно я его пробовал.
Как раз для борьбы с широкополосными помехами.
Я тоже пробовал, только для разделения основного тона и огибающей спектрального пакета при обработке речи. Алгоритм получился весьма хорошим, но... вычислительно напряжённым.
Кстати, вот немного исправленный и дополненный вариант программы:
Код
function puls_remove()
% Задаём сетки
f_len=16;
sampl = [1:f_len]';
sampl1=sampl;
% Задаём пороги
Thresh=25;
Thresh1=4;
Thresh2=25;
% Задаём значения функций
A = [35 39 56 41 40 43 39 43 43 60 45 45 42 45 45 46]';
fi= [46 21 18 22 20 21 24 23 22 19 24 22 21 22 22 27]';
% A = [54 44 38 46 54 59 59 56 51 16 49 46 49 47 52 58]';
% fi= [-121 -120 -117 -100 -97 -104 -110 -111 -107 -130 -105 -108 -104 -92 -87 -91]';
%
% A = [47 47 89 52 53 59 62 64 68 70 73 75 82 83 87 92]';
% fi= [168 115 117 116 75 118 118 118 117 116 114 116 117 114 115 116]';
% Аппроксимируем функции полиномами первого порядка (отрезками прямых)
fit_A = fit(sampl, A, 'poly1');
A_fit = feval(fit_A, sampl);
fit_fi= fit(sampl, fi,'poly1');
fi_fit = feval(fit_fi, sampl);
% Рисуем функции и аппроксимации
figure(1)
plot (A, '.-', 'Color', [0 0.6 0], 'MarkerEdgeColor','k')
hold on
plot (A_fit, '.-', 'Color', [0.9 0 0.9], 'MarkerEdgeColor','k')
grid on
set(gca,'XTick',1:16)
figure(2)
plot (fi, '.-', 'Color', [0 0.6 0], 'MarkerEdgeColor','k')
hold on
plot (fi_fit, '.-', 'Color', [0.9 0 0.9], 'MarkerEdgeColor','k')
% hold off
grid on
set(gca,'XTick',1:16)
% Вычисляем модули расстояний
dist_A =abs(A-A_fit);
dist_fi=abs(fi-fi_fit);
% %********************************************************************
% % Вычисляем их медианы
% med_A = median(dist_A);
% med_fi= median(dist_fi);
%
% % Нормализуем (приводим медианы к одному и тому же значению)
% dist_fi = dist_fi * med_A/med_fi;
%
% % Вычисляем квадрат эвклидова расстояния в каждой точке выборки
% dist2 = dist_A.*dist_A + dist_fi.*dist_fi;
%
% % Отбрасываем ненужные точки
% for (i=16:-1:1)
% if (dist2(i) > Thresh*med_A*med_A)
% A(i)=[]; fi(i)=[]; sampl1(i)=[];
% end
% end
% %*********************************************************************
% Или вычисляем среднюю мощность (требует другого порога!)
% msq_A = (dist_A'*dist_A)/f_len;
% msq_fi = (dist_fi'*dist_fi)/f_len;
%
% % Нормализуем (приводим СКЗ к одной и той же величине)
% dist_fi = dist_fi * sqrt(msq_A/msq_fi);
%
% % Вычисляем квадрат эвклидова расстояния в каждой точке выборки
% dist2 = dist_A.*dist_A + dist_fi.*dist_fi;
%
% % Отбрасываем ненужные точки
% for (i=16:-1:1)
% if (dist2(i) > Thresh1*msq_A)
% A(i)=[]; fi(i)=[]; sampl1(i)=[];
% end
% end
% %*********************************************************************
% Или вычисляем медианную мощность
sq_A = dist_A.*dist_A;
sq_fi= dist_fi.*dist_fi;
mpw_A = median(sq_A);
mpw_fi= median(sq_fi);
% Нормализуем
sq_fi = sq_fi * mpw_A/mpw_fi;
% Вычисляем квадрат эвклидова расстояния в каждой точке выборки
dist2 = sq_A + sq_fi;
% Отбрасываем ненужные точки
for (i=16:-1:1)
if (dist2(i) > Thresh2*mpw_A)
A(i)=[]; fi(i)=[]; sampl1(i)=[];
end
end
%*********************************************************************
% Делаем аппроксимацию функций с выброшенными точками полиномами
% 2-го (или иного) порядка.
fit_A = fit(sampl1, A, 'poly2');
A_fit = feval(fit_A, sampl);
fit_fi= fit(sampl1, fi,'poly2');
fi_fit = feval(fit_fi, sampl);
% Рисуем окончательный результат (красным-функции с выброшенными точками)
figure(1)
plot (sampl1, A, '.-', 'Color', [0.8 0 0], 'MarkerEdgeColor','k')
plot (sampl, A_fit, '.-', 'Color', [0 0 1], 'MarkerEdgeColor','k')
hold off
figure(2)
plot (sampl1, fi, '.-', 'Color', [0.8 0 0], 'MarkerEdgeColor','k')
plot (sampl, fi_fit, '.-', 'Color', [0 0 1], 'MarkerEdgeColor','k')
hold off
%*********************************************************************
% Окончательные значения полиномов A_fit и fi_fit можно взять в качестве
% выходных значений функций (синие линии).
%*********************************************************************
return;
Прошу прощения за длиннющий пост - файл что-то прицепить не получается.
Пороги взяты "от балды"; их нужно уточнить, исходя из статистики сигнала и помехи, и требований к вероятности пропуска помехи / ложного отбрасывания.