Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программирование фильтра(need)help, Нужно реализовать цифровой фильтр на C++ 
:(
    Опции темы
Hitriy
Дата 6.6.2006, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Значит так, есть рассчитанный цифровой фильтр, расчеты произведены в Matlab. Нужно теперь релизовать этот фильтр на C++ для того, чтобы оценить его быстродействие. Фильтр представляет собй передаточную функцию из 5 звеньев второго порядка, т.е. это произведение 5 дробей, каждай из которых содержит по 3 члена в чилителе и 3 члена в знаменателе, вида a+bz^(-1)+cz(-2). На вход такого фильтра поступает гармонический сигнал. Нужно знать время через которое он появиться на выходе.
Сам нахожусь в растерянности, т.к. C Забыл окончательно...А времени вспомнить нет...курсовик нужно сдать завтра...Может кто-нить помочь? 
PM MAIL   Вверх
Hitriy
Дата 6.6.2006, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Есть даже примерная прога....тока она не работает почему-то...(( 
PM MAIL   Вверх
maxim1000
Дата 6.6.2006, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



Цитата(Hitriy @  6.6.2006,  22:29 Найти цитируемый пост)
Есть даже примерная прога....тока она не работает почему-то...((

ну если её текст не привести, то и помочь выяснить, почему не работает, никто не сможет... 


--------------------
qqq
PM WWW   Вверх
Hitriy
Дата 6.6.2006, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Код

#include <iostream.h>
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <math.h>

#define N 10000                           // количество отчетов.
double pi = 3.14159262358; 
double fd = 20000;                             // частота дискретизации.
double Td = 1/fd;                                // период дискретизации.
double kx[] = {0.00000179199446815,
            -0.00000000000000107,
            -0.00001791994469080,
            -0.00000000000000963,
             0.00008063975101180,
            -0.00000000000003897,
            -0.00021503933627187,
            -0.00000000000008060,
             0.00037631883808587,
            -0.00000000000025391,
            -0.00045158260607892,
            -0.00000000000019162,
             0.00037631883827594,
            -0.00000000000010514,
            -0.00021503933616973,
            -0.00000000000002848,
             0.00008063975102313,
             0.00000000000000286,
            -0.00001791994467976,
             0.00000000000000099,
             0.00000179199446716};                         // коэффициенты при входном сигнале.
double ky[] = {1.00000000000000,
             0.00000000000000,
             5.95822190598452,
             0.00000000000002,
             16.52036574907386,
             0.00000000000005,
             27.89675155215294,
             0.00000000000009,
             31.64095866933442,
             0.00000000000018,
             25.11168207518977,
             -0.00000000000002,
             14.09029209156237,
             -0.00000000000001,
             5.50913740174290,
             0.00000000000001,
             1.43427731338344,
             -0.00000000000000,
             0.22423501872903,
             -0.00000000000000,
             0.01596913278049};                 // коэффициенты при выходном сигнале.
double x[N + 20];                              // входной сигнал.

DWORD WINAPI  Cheb_thread_code(LPVOID) // поток вычисления выходного сигнала
  {
    int k,n; 
    double y[N + 20];                     // выходной сигнал.
    DWORD tm;
    tm = GetTickCount();              // засекаем время начала вычисления выходного сигнала.
    for (k = 0; k < 20 ; k++) y[k] = 0;
    for(k=0;k<(N+20);k++)
    {
        for(n=0,y[k]=0;(k-n)>=0;n++)
        {
            y[k] += kx[n]*ky[k-n];
        }
    }
    tm = GetTickCount() - tm;      //время вычисления выходного сигнала в миллисекундах.
    cout<<y[0]<<endl<<y[1]<<endl<<y[2]<<endl;
    printf("%d ms",tm);              
    return 1;
  }
void main()
  {
    int i;
    unsigned long ThreadId;
    for (i=0;i<11;++i) x[i] = 0;                                                          //вычисление 
    for (i = 1; i < N ; ++i)                                                                  // входного
          x[i+10] = sin(2*pi*600*Td*i) + 2*sin(2*pi*8000*Td*i);           // сигнала.
    CreateThread(NULL,0,Cheb_thread_code,x,0,&ThreadId);     // создание потока.
    getch();
  }

 Модератор: люби ближних своих, пользуйся тэгами code!  

Это сообщение отредактировал(а) Earnest - 8.6.2006, 07:17
PM MAIL   Вверх
maxim1000
Дата 7.6.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



Цитата(Hitriy @  6.6.2006,  22:39 Найти цитируемый пост)
    for (k = 0; k < 20 ; k++) y[k] = 0;
    for(k=0;k<(N+20);k++)

зачем заполнять первые 20 дискрет по второму разу?
их как раз надо заполнить сначала нулями, а потом не трогать, потому что корректно заполнить их по общему правилу нельзя - нет элементов y[-1],y[-2],...
так что во втором цикле надо начинать с k=20

Цитата(Hitriy @  6.6.2006,  22:39 Найти цитируемый пост)
y[k] += kx[n]*ky[k-n];

а эта формула имеет очень мало общего с цифровой фильтрацией - она вообще никак не использует сигнал...

фильтр с передаточной функцией, представленной в виде дроби, вычисляется по-другому:
если, например, y=(1+a*z^-1)/(1+b*z^-1+c*z^-2) x
то нужно домножить обе части на знаменатель:
(1+b*z^-1+c*z^-2)y=(1+a*z^-1)x
потом вспомнить, что такое z:
y[n]+b*y[n-1]+c*y[n-2]=x[n]+a*x[n-1]
и выразить y[n]:
y[n]=x[n]+a*x[n-1]-b*y[n-1]-c*y[n-2]
 


--------------------
qqq
PM WWW   Вверх
Hitriy
Дата 9.6.2006, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Ну дык че никак? Вообще.... 
PM MAIL   Вверх
Earnest
Дата 9.6.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Hitriy, что значит "никак".
Если тебя ответ maxim1000 не удовлетворяет, так спроси, уточни.
А если хочешь, чтобы все за тебя сделали, то обращайся в Центр помощи.
 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.