|
|
  |
Библиотека БПФ для LPC21xx |
|
|
|
Nov 11 2010, 16:28
|

Местный
  
Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202

|
Массив Int, на выходе должны получиться амплитуды частот. Я так понимаю, если задать 512 входных значений получим 256 амплитуд частот? Что такое Цитата физического спектра с логарифмической шкалой ?
|
|
|
|
|
Nov 11 2010, 17:12
|

山伏
    
Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294

|
Цитата(LexRoss @ Nov 11 2010, 18:28)  Массив Int, ...я не о типе данных спрашивал, а комплексные входные данные или вещественные? Цитата(LexRoss @ Nov 11 2010, 18:28)  на выходе должны получиться амплитуды частот. Частоты бывают разные. У "уоллша" тоже частоты... Цитата(LexRoss @ Nov 11 2010, 18:28)  Я так понимаю, если задать 512 входных значений получим 256 амплитуд частот? Для Real входного массива впринципе верно. По всей видимости Вам нужен RealFFT. Гуглим по этому слову... Цитата(LexRoss @ Nov 11 2010, 18:28)  Что такое ? рановато Вам браться за FFT. С такими познаниями Вы даже протестировать не сможете правильно у Вас все заработало или нет.
--------------------
Нас помнят пока мы мешаем другим... //-------------------------------------------------------- Хороший блатной - мертвый... //-------------------------------------------------------- Нет старик, это те дроиды которых я ищу...
|
|
|
|
|
Nov 11 2010, 18:11
|
Группа: Участник
Сообщений: 12
Регистрация: 15-07-09
Пользователь №: 51 296

|
Почитайте Юкио Сато "Обработка сигналов". Написано так, что даже школьник разберётся.
|
|
|
|
|
Nov 12 2010, 01:48
|

山伏
    
Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294

|
Цитата(LexRoss @ Nov 11 2010, 19:39)  Посоветуйте что почитать, чтобы более-менее понятно было. Пробовал читать Гольденберг. ЦОС - слишком много математики, ничего не понятно. Ну я начинал вот с этой статьи(очень хороший материал!) и книги Тима Кинтцеля(ее нетрудно найти в сети). Но прочесть это одно, а понять это другое  ... Читайте, экспериментируйте спрашивайте... Относительно именно RealFFT - вот недавно ссылались на этот материал. Хороший... На русском почти то же - Р.Лайонс ст.483. Но для начала все-таки хватит первой ссылки, дабы не запудривать мозги... Цитата(shista @ Nov 11 2010, 20:11)  Почитайте Юкио Сато "Обработка сигналов". Написано так, что даже школьник разберётся. У Сато просто потрясающе дан(введен) коэффициент корреляции - так наглядно и понятно даже школьнику, это нужно умет так подать, не всем дано... А а вот FFT там дан довольно классически, хотя тоже неплохо, но + то, что исходник там на basic, для практики начинать изучение с него я бы не советовал. А RealFFT там вообще не дан! Все таки цель его брошюрки научить понимать, а не перечислить все приемы ЦОС на сегодняшний день.
--------------------
Нас помнят пока мы мешаем другим... //-------------------------------------------------------- Хороший блатной - мертвый... //-------------------------------------------------------- Нет старик, это те дроиды которых я ищу...
|
|
|
|
|
Nov 19 2010, 08:09
|

Местный
  
Группа: Свой
Сообщений: 377
Регистрация: 31-01-09
Пользователь №: 44 202

|
Код #include <LPC21xx.H> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define PI 3.14159265358979323846 void BPF(float *x, float *y, int N, int I) {
register float c,s,t1,t2,t3,t4,u1,u2,u3; register int i,j,p,l,L,M,M1,K; L=N; M=N/2; M1=N-1; while(L>=2){
l=L/2; u1=1.; u2=0.; t1=PI/(float)l; c=cos(t1); s=(-1)*I*sin(t1); for(j=0; j<l;j++) { for(i=j;i<N;i+=L) {
p=i+l; t1=*(x+i)+*(x+p); t2=*(y+i)+*(y+p); t3=*(x+i)-*(x+p); t4=*(y+i)-*(y+p); *(x+p)=t3*u1-t4*u2;
*(y+p)=t4*u1+t3*u2; *(x+i)=t1; *(y+i)=t2;
}
u3=u1*c-u2*s; u2=u2*c+u1*s; u1=u3; }
L/=2; } j=0; for(i=0;i<M1;i++) { if(i>j) { t1=*(x+j); t2=*(y+j); *(x+j)=*(x+i); *(y+j)=*(y+i); *(x+i)=t1; *(y+i)=t2; } K=M; while(j >=K) { j-=K;K/=2; } j+=K; } }
int main (void) { IODIR1 = 0x00FF0000;
int j,N; float *x,*y,A,Re,Im; N=8;
x=(float*)calloc(N,sizeof(float)); y=(float*)calloc(N,sizeof(float));
/*x[0]=60; // здесь зависает x[1]=65; x[2]=21; x[3]=-3; x[4]=15; x[5]=-45; x[6]=-20; x[7]=70; */ BPF(x,y,N,1);
for(j=0;j < N/2;j++) { Re=*(x+j); Im=*(y+j); A=2.*sqrt(Re*Re+Im*Im)/(float)N;
}
while (1) { } } Программа зависает при попытке записи в x[0]. Если закомментировать, останавливается на строке *(x+p)=t3*u1-t4*u2; Мне кажется проблема в ф-ии calloc(). Или еще в чем-то? Помогите, пожалуйста.
|
|
|
|
|
Nov 19 2010, 08:46
|

山伏
    
Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294

|
1) Попробуйте поставить десятичную точку после цифр. Но вообще зачем calloc? Объявите обычные массивы. 2) уберите float. ARM7 с ним еле работают. потери производительности в минимум в 100 раз... 3) директива register на данный момент уже не поддерживается, да и регистров Вам явно бы не хватило. 4) c=cos(t1); s=(-1)*I*sin(t1); - тоже не добавляет скорости. Нужно читать данные из таблицы, а если еще вспомнить что sin(x) и cos(x) похожи как 2-е капли воды, то... Хотя для первого теста - сойдет. Кстати вот...
--------------------
Нас помнят пока мы мешаем другим... //-------------------------------------------------------- Хороший блатной - мертвый... //-------------------------------------------------------- Нет старик, это те дроиды которых я ищу...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|