Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ких-фильтр нижних частот на visualdsp
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
G00dWIN
Ребята, прошу помощи в связи с тем, что совсем не хватает времени.
Нужен алгоритм реализации ких-фильтрна нижних частот, желательно, целым проектом. (VisualDSP)
Я сделал:
1. Рассчёт коэффициентов в FDAtool
2. С помощью проги на с++ добавил в конец каждого коэффициента символ "r" (где-то вычитал, что это нужно для правильной работы с числами с плавающей запятой.

В проекте нужно:
1. Собсно, сам когд.
2. Файл с коэффициентами входного сигнала.

Исходные данные:
Ких-фильтр нижних частот.
Частота среза: 60 кГц + 20 Гц
Подавление: 40 дБ
Неравномерность в полосе пропускания: 3 дБ
Частота дискретизации: 200 кГц

Так же прикрепляю скриншот из FDAtool и полученный файл с коэффициентами.


Ребята, нужен проект со всем этим, помогите пожалуйста, сроки очень поджимают!!!((((

PS: adps-2181
blackfin
В папке C:\Program Files\Analog Devices\VisualDSP 5.0\Blackfin\Examples\Tutorial\fir\ есть готовый проект fir.dpj с подробными комментариями.
G00dWIN
Цитата(blackfin @ Dec 23 2012, 11:53) *
В папке C:\Program Files\Analog Devices\VisualDSP 5.0\Blackfin\Examples\Tutorial\fir\ есть готовый проект fir.dpj с подробными комментариями.



Да, видел, но это не то!
Там входной сигнал берётся с одного из портов.
Мне надо, чтобы входной сигнал задавался .dat файлом.


А ещё у меня не blackfin, a adsp-2181!
blackfin
Цитата(G00dWIN @ Dec 23 2012, 11:58) *
Мне надо, чтобы входной сигнал задавался .dat файлом.

На этапе компиляции буфер можно заполнить данными с помощью ассемблерной директивы:

.var buffer[] = "init.dat";

Можно считать данные из файла *.dat и с помощью обычных функций fopen(), fread() из <stdio.h>, поскольку в *.dat числа хранятся в обычном текстовом формате. (См. help VisualDSP)
Цитата(G00dWIN @ Dec 23 2012, 11:58) *
А ещё у меня не blackfin, a adsp-2181!

А смысл в adsp-2181? Он же всё равно не успеет посчитать в realtime fir-filter c 10 тыс. taps на частоте Fs=200 кГц. Как, впрочем, и BF.
G00dWIN
Цитата(blackfin @ Dec 23 2012, 13:48) *
На этапе компиляции буфер можно заполнить данными с помощью ассемблерной директивы:

.var buffer[] = "init.dat";

Можно считать данные из файла *.dat и с помощью обычных функций fopen(), fread() из <stdio.h>, поскольку в *.dat числа хранятся в обычном текстовом формате. (См. help VisualDSP)

А смысл в adsp-2181? Он же всё равно не успеет посчитать в realtime fir-filter c 10 тыс. taps на частоте Fs=200 кГц. Как, впрочем, и BF.



Можете написать мне на почту: evv93@mail.ru, или сообщите, пожалуйста свою мне в ЛС, либо другой удобный для Вас способ связи. У меня почему-то нет возможности отправлять ЛС на форуме...

По поводу 2181 - так поставлена задача...
blackfin
Цитата(G00dWIN @ Dec 23 2012, 14:23) *
По поводу 2181 - так поставлена задача...

Так я вам вряд ли смогу помочь. Я с этим процессором никогда не работал.
G00dWIN
Цитата(blackfin @ Dec 23 2012, 14:32) *
Так я вам вряд ли смогу помочь. Я с этим процессором никогда не работал.



Это печально, весьма печально!

Господа, ну хоть кто-нибудь может мне помочь?

Я готов даже заплатить за ваш час работы! А то и меньше...
G00dWIN
Так, пара вопросов.

1. Надо организовать файл с дискретными значениями входного сигнала. Если частота дискретизации 200 кГц, то какое должно быть число отсчётов? 200000, я полагаю?
2. Каким конкретно образом рассчитать все коэффициенты и засунуть их в текстовый файл в нужном формате? Помогите пожалуйста, хотя бы этим, желательно, примерами.
blackfin
Цитата(G00dWIN @ Dec 23 2012, 16:13) *
Так, пара вопросов.

Зачет? Сессия? biggrin.gif

Цитата(G00dWIN @ Dec 23 2012, 16:13) *
2. Каким конкретно образом рассчитать все коэффициенты и засунуть их в текстовый файл в нужном формате? Помогите пожалуйста, хотя бы этим, желательно, примерами.

Файл *.dat можно сделать самому.

Вот первые восемь байт такого файла в формате "Hexadecimal":
Код
@@Hexadecimal
0xFF
0x7F
0x00
0x00
0x23
0x81
0xF8
0x10

Вот первые восемь 16-ти битных семпла файла в формате "Signed Integer 16 bit":
Код
@@Signed Integer 16 bit
+32767
+0
-32477
+4344
+31615
-8611
-30194
+12726

Вот первые восемь 16-ти битных семпла файла в формате "Signed Fractional 16 bit":
Код
@@Signed Fractional 16 bit
+0.999969482421875
+0.0
-0.991119384765625
+0.132568359375
+0.964813232421875
-0.262786865234375
-0.92144775390625
+0.38836669921875
G00dWIN
Цитата(blackfin @ Dec 23 2012, 17:25) *
Зачет? Сессия? biggrin.gif



Курсовая sad.gif
Честно говоря, не понял Вашего поста...


Блин, ну кто-нибудь, пожалуйста, реализуйте мне этот проект :3
G00dWIN
Нажмите для просмотра прикрепленного файлаГоспода.
Вот, собственно, реализовал:

Код
#define N 1024                        
#define P 110

.section/data data1;

.VAR input[N]="signal.dat";
.VAR out[N];
.VAR dm_inp[P];

//.section/pm pm_da;
.VAR pm_koef[P]="fir_new1.dat";

.section/pm interrupts;

__reset:JUMP start; rti; rti; rti;  // 0x0000: reset                          
               rti; rti; rti; rti;  // 0x0004: IRQ2                            
               rti; rti; rti; rti;  // 0x0008: IRQL1                            
               rti; rti; rti; rti;  // 0x000c: IRQL0                          
               rti; rti; rti; rti;  // 0x0010: SPORT0 tx                      
               rti; rti; rti; rti;  // 0x0014: SPORT1 rx                      
               rti; rti; rti; rti;  // 0x0018: IRQE                            
               rti; rti; rti; rti;  // 0x001c: BDMA                            
               rti; rti; rti; rti;  // 0x0020: SPORT1 tx or IRQ1              
               rti; rti; rti; rti;  // 0x0024: SPORT1 rx or IRQ0              
               rti; rti; rti; rti;  // 0x0028: timer                          
               rti; rti; rti; rti;  // 0x002c: power down                      

.section/pm program;

start:     M0=1;
        M1=1;
        M2=1;
        M4=1;
        
        I0=input;
        L0=N;
        I1=out;
        L1=N;
        I2=dm_inp;
        L2=P;
        
fir:     I4=pm_koef;
        L4=P;
        
        CNTR=N; DO out_ UNTIL CE;
        
        AX0=DM(I0,M0);
        DM(I2,M2)=AX0;
        
        MR=0;
        
        CNTR=P; DO calc UNTIL CE;
        MX0=DM(I2,M2);
        MY0=PM(I4,M4);
        MR=MR+MX0*MY0(RND);
        
calc:    IF MV SAT MR;

out_:     DM(I1,M1)=MR1;

end:    IDLE;


Где P - порядок фильтра.

Файл с отсчётами входного сигнала формировался в С++ следующим кодом:

Код
#include <fstream>
#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;
    double x;
    double f;
int main ()
{

    ofstream out("C:\\signal.dat");
    
    for (x=0;x<256;x++)
    {
        f=sin(3000*x);
        out<<f<<"r"<<"\n";
    }
    for (x=256;x<512;x++)
    {
        f=sin(50000*x);
        out<<f<<"r"<<"\n";
    }
    for (x=256;x<768;x++)
    {
        f=sin(80000*x);
        out<<f<<"r"<<"\n";
    }
    for (x=768;x<1024;x++)
    {
        f=sin(10000*x);
        out<<f<<"r"<<"\n";
    }


    out.close();
    system("PAUSE");
    return 0;
}


В итоге получился такой результат (см приложение).
Но мне кажется, что что-то не так... Подскажите, правильно ли всё сделано?
evil_laugh
Если два последних прилепленных изображения - это спектр на входе и выходе, то что-то Ваш ФНЧ не очень "фнчит".
asm_lock
Кстати. А за какое время (порядок) DSP производит вычисления такого фильтра ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.