![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
фильтр в делфи [D7]
demi © (2013-12-15 18:38:00)Здравствуйте! Мне нужно написать программу фильтрации в Делфи. Я задаю значения синусоиды (A,w,N) и накладываю на нее случайную помеху и мне нужно потом отфильтровать обратно эту помеху. Как это сделать? Помогите пожалуйста.
Jeer (2013-12-17 11:18:00) [1]>Я выбрала адаптивный фильтр
Это Вам надо с Калманом познакомиться.
И. Павел (2013-12-17 08:35:00) [2]> [10] demi © (16.12.13 18:34)
Вот простейший вариант фильтрации функции y = sin(x). Результат выводится на канву. На форме лежат две кнопки у одной обработчик OnClick назван GetInputClick, а у другой GetOutputClick. Первая функция генерирует сигнал с помехой, а вторая его выправляет.
Если разберетесь с этим кодом, то сможете доработать его под вашу задачу (сменить фильтр, если потребуется а также усложнить входную функцию и выводить график в более удобоваримом виде).
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
GetInput: TButton;
GetOutput: TButton;
procedure GetInputClick(Sender: TObject);
procedure GetOutputClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var a: array [1..500] of double;
procedure TForm1.GetInputClick(Sender: TObject);
var i: integer;
begin
randomize;
for i := 1 to 500 do
begin
a[i] := sin(2 * pi * i / 50) + (5 random(11)) / 100;
if i > 1 then
begin
Canvas.MoveTo(i 1, 100 + trunc(a[i 1] * 100));
Canvas.LineTo(i, 100 + trunc(a[i] * 100));
end;
end;
end;
procedure TForm1.GetOutputClick(Sender: TObject);
var i: integer;
begin
Canvas.Rectangle(0, 0, Width, Height);
for i := 1 to 500 do
begin
if (i > 2) and (i < 499) then
a[i] := (a[i 2] + a[i 1] + a[i] + a[i + 1] + a[i + 2]) / 5;
if i > 1 then
begin
Canvas.MoveTo(i 1, 100 + trunc(a[i 1] * 100));
Canvas.LineTo(i, 100 + trunc(a[i] * 100));
end;
end;
end;
end.
Inovet (2013-12-17 00:57:00) [3]> [2] Dimka Maslov © (16.12.13 09:16)
> Мне помнится, что отфильтровывать помеху научились ещё в
> XIX веке, когда после прокладки трансатлантического кабеля
> на другом конце не получили ничего, кроме помех.
Там была проблема с большой индуктивностью кабеля, насколько помнится - вручную колотили телеграфным ключом, а на другом конце электромагнит должен был притягивать якорь, не тот который на проходящих мимо кабеля кораблях. А фиг.
Jeer (2013-12-16 23:26:00) [4]О! Девушка!
( хотя, кого сейчас в ивропах считать за девушку? ) :)
Простейший фильтр экспоненциального сглаживания:
;РЕКУРСИВНЫЙ ФИЛЬТР ПЕРВОГО ПОРЯДКА
;
; B=EXP(-t/T) , A=1-B
; t - период дискретизации, Fc = 1/T - частота среза по уровню - 3 дБ.
; УРАВНЕНИЕ: Y[i] = A*X[i] + B*Y[i-1]
RWolf (2013-12-16 19:48:00) [5]google: цифровой фильтр алгоритм
demi (2013-12-16 19:36:00) [6]> KilkennyCat © (16.12.13 19:12) [11]
Я и так это знаю.... Поэтому и прошу, чтобы мне подсказали алгоритм или программную реализацию, какого-либо фильтра.
KilkennyCat (2013-12-16 19:12:00) [7]
> как реализуются фильтры сигналов в Delphi
Delphi не является готовым специализированным инструментом для обработки сигналов. Но в ней (на нем) можно таковой инструмент создать. Почувствуйте разницу.
demi (2013-12-16 18:34:00) [8]> И. Павел © (16.12.13 11:31) [5]
Я выбрала адаптивный фильтр, но дело в том, что я вообще не представляю как реализуются фильтры сигналов в Delphi -раньше только в Matlab работала...
brother (2013-12-16 17:10:00) [9]> я б ответил, честно.
да я не сомневался!
Jeer (2013-12-16 16:17:00) [10]>brother © (16.12.13 14:56) [7]
Не, ну если бы спросили "измеряю синус. сигнал, но есть наводка в виде случайного шума, как..." - я б ответил, честно.
brother (2013-12-16 14:56:00) [11]> Не добавляй помеху,
:) также отличный ответ!
Jeer (2013-12-16 14:52:00) [12]>И. Павел © (16.12.13 11:31) [5]
Ваш ответ того же класса, что и вопрос.
И. Павел (2013-12-16 11:31:00) [13]> [0] demi © (15.12.13 18:38)
Сперва решите задачу «на бумаге» выберите фильтр. Как вариант: http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B4%D0%B8%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80
Ну или можно еще проще: брать не средний элемент упорядоченного массива а среднее арифметическое.
Потом напишите программу. Для рисования удобно использовать TChart. Вот его описание: http://delphiworld.narod.ru/base/chart_comp.html
KilkennyCat (2013-12-16 09:18:00) [14]
> Dimka Maslov ©
точно! нужна еще одна диффсинусоида, и тогда сложение даст нужное без помех.
KilkennyCat (2013-12-16 09:17:00) [15]ну если ты знаешь значения синусоиды, то выкини все, что ей не принадлежит. Принадлежность точки графику в школе ведь объясняли?
Dimka Maslov (2013-12-16 09:16:00) [16]Мне помнится, что отфильтровывать помеху научились ещё в XIX веке, когда после прокладки трансатлантического кабеля на другом конце не получили ничего, кроме помех.
Jeer (2013-12-15 21:57:00) [17]Не добавляй помеху, если не знаешь как от нее избавиться.