Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Народ подскажите по Дискретному Преобр Фурье

Отправлено smartleds 13 февраля 2008 г. 12:33


Попробовал сделать ДПФ (обычное, не быстрое, на 16 отсчетов)в Делфи,
Для эксперимента взял простую функцию Sin , чтобы посмотреть ее спектр.
Помогите проанализировать результат , получается в зависимости от шага дискретизации максимальная палка спектра получается при разном "к".
Вот сама прога. Она и график на форме чертит и спектр тоже рисует.
procedure TForm1.Button7Click(Sender: TObject);
var Y,i,k,n,x,y2:integer;
var j,pi,summaRE,summaIM,tempRE,tempIM,tm: real;
var Xbig,y1 : array[0..80] of real;
var Xpicture : array[0..800] of real;
begin
N:=16;
j:=0;
for i:=0 to N-1 do
begin
// y1[i]:=sin(j)+sin(2*j)+sin(3*j);
y1[i]:=sin(j); // <---эту функцию подвергаем ДПФ
j:=j+0.9; //<--шаг дискретизации, от него почему то зависит спектр на выходе !!!???
form1.Memo1.Lines.Append('y1['+inttostr(i)+']='+floattostr(y1[i])+' ');
end;
j:=0;
k:=0;

//----Рисуем график функции
while (j<20) do
begin
//Xpicture[k]:=sin(j)+sin(2*j)+sin(3*j);
Xpicture[k]:=sin(j);
Y:=round(Xpicture[k]*10);
form1.Memo1.Lines.Append('Xpicture['+inttostr(k)+']='+inttostr(Y)+' ');
form1.Canvas.Pixels[k,Y+50]:=clRed;
k:=k+1;
j:=j+0.1;
end;

pi:=3.1415;
tm:= (2*pi)/N;
//-----------Вычисляем по ДПФ спектр
for k:=0 to N-1 do
begin
summaRE:=0;
summaIM:=0;
for n:=0 to N-1 do
begin
tempRE:=y1[n]*( cos(tm*n*k));
tempIm:=y1[n]*( sin(tm*n*k));
summaRE:=summaRE+tempRE;
summaIM:=summaIM+tempIM;
end;
Xbig[k]:=sqrt(sqr(summaRE)+sqr(summaIM)); // находим амплитуду комплексного числа
end;
// -------------- печатаем амплитуды
for i:=0 to N-1 do
begin
form1.Memo1.Lines.Append('Xbig['+inttostr(i)+']='+floattostr(Xbig[i])+' ');
end;
//-------Рисуем на форме спектр
x:=10;
y2:=100;
for i:=0 to N-1 do
begin
form1.Canvas.Pen.Color:=clred;
form1.Canvas.moveto(x,round(100-(Xbig[i]*10)) );
form1.Canvas.LineTo(x,100);
x:=x+5;
end;
end; //end proc start ftt


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 56:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru