|
|
  |
Ких-фильтр нижних частот на visualdsp, критично! |
|
|
|
Dec 23 2012, 07:04
|
Группа: Новичок
Сообщений: 8
Регистрация: 23-12-12
Пользователь №: 74 942

|
Ребята, прошу помощи в связи с тем, что совсем не хватает времени. Нужен алгоритм реализации ких-фильтрна нижних частот, желательно, целым проектом. (VisualDSP) Я сделал: 1. Рассчёт коэффициентов в FDAtool 2. С помощью проги на с++ добавил в конец каждого коэффициента символ "r" (где-то вычитал, что это нужно для правильной работы с числами с плавающей запятой. В проекте нужно: 1. Собсно, сам когд. 2. Файл с коэффициентами входного сигнала. Исходные данные: Ких-фильтр нижних частот. Частота среза: 60 кГц + 20 Гц Подавление: 40 дБ Неравномерность в полосе пропускания: 3 дБ Частота дискретизации: 200 кГц Так же прикрепляю скриншот из FDAtool и полученный файл с коэффициентами. Ребята, нужен проект со всем этим, помогите пожалуйста, сроки очень поджимают!!!(((( PS: adps-2181
Сообщение отредактировал G00dWIN - Dec 23 2012, 07:07
Эскизы прикрепленных изображений
 РЈРСВВВВВВВВВВеньшено Р В Р’В Р СћРІР‚ВВВВВВВВВР С• 87%
1280 x 1024 (237.94 килобайт)
|
Прикрепленные файлы
files.rar ( 227.98 килобайт )
Кол-во скачиваний: 14
|
|
|
|
|
Dec 23 2012, 07:58
|
Группа: Новичок
Сообщений: 8
Регистрация: 23-12-12
Пользователь №: 74 942

|
Цитата(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!
Сообщение отредактировал G00dWIN - Dec 23 2012, 08:00
|
|
|
|
|
Dec 23 2012, 09:48
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(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.
|
|
|
|
|
Dec 23 2012, 10:23
|
Группа: Новичок
Сообщений: 8
Регистрация: 23-12-12
Пользователь №: 74 942

|
Цитата(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 - так поставлена задача...
|
|
|
|
|
Dec 23 2012, 10:37
|
Группа: Новичок
Сообщений: 8
Регистрация: 23-12-12
Пользователь №: 74 942

|
Цитата(blackfin @ Dec 23 2012, 14:32)  Так я вам вряд ли смогу помочь. Я с этим процессором никогда не работал. Это печально, весьма печально! Господа, ну хоть кто-нибудь может мне помочь? Я готов даже заплатить за ваш час работы! А то и меньше...
|
|
|
|
|
Dec 23 2012, 12:13
|
Группа: Новичок
Сообщений: 8
Регистрация: 23-12-12
Пользователь №: 74 942

|
Так, пара вопросов.
1. Надо организовать файл с дискретными значениями входного сигнала. Если частота дискретизации 200 кГц, то какое должно быть число отсчётов? 200000, я полагаю? 2. Каким конкретно образом рассчитать все коэффициенты и засунуть их в текстовый файл в нужном формате? Помогите пожалуйста, хотя бы этим, желательно, примерами.
|
|
|
|
|
Dec 23 2012, 13:25
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(G00dWIN @ Dec 23 2012, 16:13)  Так, пара вопросов. Зачет? Сессия? Цитата(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
|
|
|
|
|
Dec 23 2012, 13:37
|
Группа: Новичок
Сообщений: 8
Регистрация: 23-12-12
Пользователь №: 74 942

|
Цитата(blackfin @ Dec 23 2012, 17:25)  Зачет? Сессия?  Курсовая  Честно говоря, не понял Вашего поста... Блин, ну кто-нибудь, пожалуйста, реализуйте мне этот проект :3
|
|
|
|
|
Dec 24 2012, 11:25
|
Группа: Новичок
Сообщений: 8
Регистрация: 23-12-12
Пользователь №: 74 942

|
[attachment=73668:signals.jpg]Господа. Вот, собственно, реализовал: Код #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; } В итоге получился такой результат (см приложение). Но мне кажется, что что-то не так... Подскажите, правильно ли всё сделано?
Сообщение отредактировал G00dWIN - Dec 24 2012, 11:26
Эскизы прикрепленных изображений
 РЈРСВВВВВВВВВВеньшено Р В Р’В Р СћРІР‚ВВВВВВВВВР С• 82%
921 x 295 (91.92 килобайт)
|
 РЈРСВВВВВВВВВВеньшено Р В Р’В Р СћРІР‚ВВВВВВВВВР С• 82%
921 x 331 (88.89 килобайт)
|
 РЈРСВВВВВВВВВВеньшено Р В Р’В Р СћРІР‚ВВВВВВВВВР С• 82%
921 x 295 (67 килобайт)
|
 РЈРСВВВВВВВВВВеньшено Р В Р’В Р СћРІР‚ВВВВВВВВВР С• 82%
921 x 331 (63.48 килобайт)
|
|
|
|
|
|
Dec 24 2012, 21:06
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
Если два последних прилепленных изображения - это спектр на входе и выходе, то что-то Ваш ФНЧ не очень "фнчит".
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|