andreichk 0 5 апреля, 2008 Опубликовано 5 апреля, 2008 · Жалоба //--------------- собственно кривая A --------------------------- void curve_A(unsigned int16 n,unsigned int8 y_pos){ unsigned int8 x=1 , y , yy , syncF=0, Nn=0;//Зануляем значение периода for(ever){ if (n++>8192){// Если дошли до сюда, значит не удалось найти период Nn=0;return;// Занулим частоту (типа не посчитали... ) } #asm BCF 0x0F8B,2//LATC2=0;//Output_bit(READ_FIFO_A ,0);//PIN_C2. разрешить #endasm y=input_b(); //чтение порта В #asm BSF 0x0F8B,2//LATC2=1;//Output_bit(READ_FIFO_A ,1);//PIN_C2.запретить #endasm y = (y > 200) ? 200 : y;// ограничитель до выбранной величины y = (255 - y); // разворот на 180° по вертикали if(syncF==0) { // Первый этап Nn++; if (syncA){ if(y>sync_volume_A) syncF=1; }else{ if(y<sync_volume_A+115) syncF=1; } }else if(syncF==1){// Второй этап Nn++; if (syncA){ if(y<sync_volume_A) syncF=2; }else{ if(y>sync_volume_A+115) syncF=2; } } if(x==255){// Успешно нашли период //Если закончили отрисовку,посчитаем частоту frequenz(FclockA/Nn,194, 230);Nn=0;return; } //........................................................ if(x<255){//Рисуем, пока не вышли за пределы экрана y+= y_pos; //сдвигаем для отображения if (yy>y) front(x,yy,y); // Рисуем фронт if (yy<y) spad(x,yy,y); // Рисуем спад pixel(x,y,1); // Рисуем вершину x++; yy=y; } } }//--------------------------OK //################################################# Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 5 апреля, 2008 Опубликовано 5 апреля, 2008 · Жалоба Ваш подход неправильный. Вы проверяете X и даже не проверяете, посчиталась ли на днный момент частота. Т.е. если частота еще не успела посчитаться (сигнал развернут так, что период длиннее экрана) То на экран выведеться ошибочная частота, равная периоду экрана а не сигнала. Если же вы всетаки хотите отдельный if то придется сделать так: if((x==255)&&(syncF==2)){// Успешно нашли период //Если закончили отрисовку,посчитаем частоту frequenz(FclockA/Nn,194, 230);Nn=0;return; } ;) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 5 апреля, 2008 Опубликовано 5 апреля, 2008 · Жалоба Ок,исправил как велел сенсей :maniac: :twak: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 5 апреля, 2008 Опубликовано 5 апреля, 2008 · Жалоба Ок,исправил как велел сенсей :maniac: :twak: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 7 апреля, 2008 Опубликовано 7 апреля, 2008 · Жалоба Откопал тут ещё кусок кода.Скажите, это тоже Фурье-преобразование? CCS его переварил. #define SWAP( a , B ) tempr=( a);( a)=( B );( B )=tempr four2(double data[] , int nn, int isign ) { int n,mmax,m,j,istep,i; double wtemp,wr,wpr,wpi,wi,theta; double tempr,tempi; double p2;p2=8*atan(1); n=nn << 1; j=0; for (i=0;i<n;i+=2) { if (j > i) { SWAP(data[j],data[i]); SWAP(data[j+1],data[i+1]); } m=n >> 1; while (m >= 2 && j >= m) { j -= m; m >>= 1; } j += m; } mmax=2; while (n > mmax) { istep=2*mmax; theta=-p2/(isign*mmax); wtemp=sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0; wi=0.0; for (m=0;m<mmax;m+=2) { for (i=m;i<n;i+=istep) { j=i+mmax; tempr=wr*data[j]-wi*data[j+1]; tempi=wr*data[j+1]+wi*data[j]; data[j]=data[i]-tempr; data[j+1]=data[i+1]-tempi; data[i] += tempr; data[i+1] += tempi; } wr=(wtemp=wr)*wpr-wi*wpi+wr; wi=wi*wpr+wtemp*wpi+wi; } mmax=istep; } } #undef SWAP Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 8 апреля, 2008 Опубликовано 8 апреля, 2008 · Жалоба Откопал тут ещё кусок кода.Скажите, это тоже Фурье-преобразование? CCS его переварил. Да оно. Только как видите оно оперирует с числами с плавающей запятой. поэтому вам нужно сделать массив типа float из 256 байт, который будет занимать 1024 байта. - Как раз влезет в ваш проц. (наверное все double в процедуре следует исправить на float) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 8 апреля, 2008 Опубликовано 8 апреля, 2008 · Жалоба буфер сделал и он влез(даже ещё 30% RАМ осталось). теперь что с ним делать? И ещё вопрос имею, что это и как им пользоваться? #define SWAP( a , B ) tempr=( a);( a)=( B );( B )=tempr Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 8 апреля, 2008 Опубликовано 8 апреля, 2008 · Жалоба буфер сделал и он влез(даже ещё 30% RАМ осталось). теперь что с ним делать? Перед преобразованием в него нужно занести 256 значений из FIFO буффера. И ещё вопрос имею, что это и как им пользоваться? #define SWAP( a , B ) tempr=( a);( a)=( B );( B )=tempr Да это просто макрос. Который меняет местами 2 элемента. Сделан чисто для лучшей читаемости кода Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 8 апреля, 2008 Опубликовано 8 апреля, 2008 · Жалоба ну вот таким макаром слепил, вроде рисует какие-то палки, но они беспорядочные.Наверное тоже надо синхронизацию втыкать void spectrum_analizator(unsigned int8 y_pos) {unsigned int8 x=0,y,yy; setCursorAddress(0x2581); clear_graphic();delay_ms(100); #asm BCF 0x0F8B,0 //Output_bit(PLCD_FIFO_RES,0);//PIN_C0 сброс FIFO в "0" BSF 0x0F8B,0 //Output_bit(PLCD_FIFO_RES,1);//PIN_C0 и разрешение на считывание BSF 0x0F8B,1 //Output_bit(READ_FIFO_B,1);//PIN_C1 запрет канала B #endasm for(x=0;x<255;x++){ #asm BCF 0x0F8B,2//LATC2=0; #endasm Buf[x]=input_b(); //чтение порта В #asm BSF 0x0F8B,2//LATC2=1; #endasm } for(x=0;x<255;x++){ Buf_FFT[x]=SWAP(Buf[x]);// } for(x=0;x<255;x++){ yy=y; y = Buf_FFT[x];// y = (y > 200) ? 200 : y; //ограничитель до выбранной величины if (yy>y) front(x,yy,y);// Рисуем фронт if (yy<y) spad(x,yy,y); // Рисуем спад pixel(x,y,1); // Рисуем вершину } } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 8 апреля, 2008 Опубликовано 8 апреля, 2008 · Жалоба ну вот таким макаром слепил, вроде рисует какие-то палки, но они беспорядочные.Наверное тоже надо синхронизацию втыкать Непонял, это вообще что такое вы написали???? Заместо этого: Buf_FFT[x]=SWAP(Buf[x]);// Надо Buf_FFT[x]=Buf[x]; А где само преобразование фурье-то? П.С. Для стабильности показаний, конечно же лучше буффер тоже синхронизировать Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 8 апреля, 2008 Опубликовано 8 апреля, 2008 · Жалоба Buf_FFT[x]=SWAP(Buf[x]);// А где само преобразование фурье-то? вообще я думал, что это оно и есть :07: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 8 апреля, 2008 Опубликовано 8 апреля, 2008 · Жалоба вообще я думал, что это оно и есть :07: Вот же оно: four2(double data[] , int nn, int isign ) Вы сами же его и привели Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 8 апреля, 2008 Опубликовано 8 апреля, 2008 · Жалоба и куды его втыкать? я точно свихнусь с этим аппаратом :07: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flann 0 8 апреля, 2008 Опубликовано 8 апреля, 2008 · Жалоба и куды его втыкать? я точно свихнусь с этим аппаратом :07: После того, как заполните массив Buf_FFT[] вызываете функцию: four2(Buf_FFT,512,1) Извиняюсь, надо так: four2(Buf_FFT,128,1) Потом надо будет еще кое чего подшаманить чтобы получить настоящий спектр... я помоему как -то ссылку уже давал.... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andreichk 0 8 апреля, 2008 Опубликовано 8 апреля, 2008 · Жалоба сделал так, только он теперь рисует точно такую же картинку как просто осциллограф. for(x=0;x<255;x++){ #asm BCF 0x0F8B,2//LATC2=0; #endasm Buf[x]=255 - input_b(); //чтение порта В #asm BSF 0x0F8B,2//LATC2=1; #endasm } for(x=0;x<255;x++){ Buf_FFT[x]=Buf[x];// } four2(Buf_FFT[x],512,1); for(x=0;x<255;x++){ yy=y; y = Buf_FFT[x] + y_pos;// y = (y > 200) ? 200 : y; //ограничитель до выбранной величины if (yy>y) front(x,yy,y);// Рисуем фронт if (yy<y) spad(x,yy,y); // Рисуем спад pixel(x,y,1); // Рисуем вершину } } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться