Radek

Members
  • Posts

    6
  • Joined

  • Last visited

Radek's Achievements

Newbie

Newbie (1/5)

0

Reputation

  1. Hello, Im trying to calculate crosscorrelation between sine signal (base with 1/rev frq) and vibration signal to get vibration response for the 1/rev (unbalance calculation), the vibration signal is very noisy, therefore crosscorrelation is used. The code is very simple, see bellow. But it is very slow, it takes around 1s to calculate it within my application. Is there any faster way? The number of loops is maxci*Vibe_Window_Skut in my case it is approx 20*100=2 000. The CorrBase is sine function with -1 to 1 amplitude. The testVibes is also in the range around -1 to +1. Code>>>>>>>>>>>>>>>>>>>> for (ci=0, ci<= maxci, ci++) for (cj=0, cj<=(Vibe_Window_Skut-1), cj++) ck = ci+cj if (ck > Vibe_Window_Skut) ck=ck-Vibe_Window_Skut-1 ///pri preteceni okna se zacne brat od zacatku endif Vibe_CrossCorr[ci] = Vibe_CrossCorr[ci] + testVibes[cj]*CorrBase[ck] ///vypocet krosskorelace endfor endfor Vibe_CrossCorr = Abs(Vibe_CrossCorr) v.Vib1rev.AddValue=Max(Vibe_CrossCorr)*Corr_Koef*KoefAkcelerometru
  2. Perfect, Resolved, thank you for your help it works with the 18.1. Regards, Radek. Final code for ref>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> /////PICO SCOPE Measurment Block read //global PSBufferCHA_raw[8192][2] = 0 global PSBufferCHA_raw = new(DMemory) PSBufferCHA_raw.alloc(8192*2) global PSBufferCHA_rawPointer = 0 PSBufferCHA_rawPointer = PSBufferCHA_raw.getPointer() global PSBufferCHA_rawWord[8192] = -1 global PSsampleInterval = 20 //Sample time in us / mikrosekund cas pro samplovani - NENI POUZITO, je to jen pro stream, ktery nefunguje global PSTimebase = 500 ///500 is cca 40kHz 20e6/(500-1) global PSsampleInterval_ns = 20 //real sample time ins ns / skutecny samplovaci cas v ns, je pak aktualizovano funkci ..GetTimebase global PStimeIndisposedMs = 0 //real time to take one block / skutecny cas na sebrani jednoho bloku v Ms global PSmaxSamples = 8192 //max no of samples / skutecne mnozstvi samplu ktere umoznuje pamet zarizeni, je pak aktualizovano funkci ..GetTimebase global PSnoOfSamples = 8192 //on entry: the number of samples requested; on exit,the number of samples actually returned, aktualizovano funkci ..GetValues global PSnoOfSamplesExit = 8192 //samples in buffer after data acquisistion /pocet dat buferu po mereni global PSoverflow = 0 //indicate whether an overvoltage has occurred on any of the channels. It is a bit pattern with bit 0 denoting Channel A and bit 1 Channel B. global PSReady = 1 //on exit, indicates the state of the collection. If zero, the device is still collecting. If non-zero, the device has finished collecting and ps4000GetValues can be used to retrieve the data. global PICOStatusRunBlock = -1 global PICOStatusIsReady = -1 global PICOStatusSetDataBuffer = -1 global PICOStatusGetValues = -1 private i = 0 extern("ps4000.dll","long ps4000SetChannel(word, byte, word, word, byte)","ps4000SetChannel","stdcall") //CH A setting / nastaveni kanalu A extern("ps4000.dll","long ps4000GetTimebase(word, ulong, long, long[1], word, long[1], uword)","ps4000GetTimebase","stdcall") ///Time base check / zjisteni Time Base extern("ps4000.dll","long ps4000RunBlock(word, long, long, ulong, word, long[1], uword, long, long[1])","ps4000RunBlock","stdcall") ///spusteni mereni Bloku extern("ps4000.dll","long ps4000GetValues(word, ulong, ulong[1], ulong, word, uword, word[1])","ps4000GetValues","stdcall") ////stazeni hodnot z buferu driveru pro Blok mod extern("ps4000.dll","long ps4000IsReady(word, word[1])","ps4000IsReady","stdcall") extern("ps4000.dll","long ps4000SetDataBuffer(word, word, ulong, long)","ps4000SetDataBuffer","stdcall") ///registrace data Bufferu A i=0 while (i <= PSnoOfSamples) ///baseline buffer setting -1 set to confirm it is reading something/ vycteni hodnot z bufferu do virtualniho kanalu PSBufferCHA_rawWord = -1 i=i+1 endwhile ///SET CHANNELS while (PICOStatus != 0) PICOStatus = ps4000SetChannel(PSHandle,0,1,1,8) ///handle, channel, enabled, AC /DC (0/1), range PICOStatus = ps4000SetChannel(PSHandle,1,0,1,8) endwhile ///GET TIME BASE PICOStatus = ps4000GetTimebase(PSHandle,PSTimebase,8192,@PSsampleInterval_ns,1,@PSmaxSamples,0) ///handle, timebase (500 odpovida cca 40kHz 20e6/(500-1)), noSamples, *timeIntervalNanoseconds, oversample, *maxsample, segmentIndex PSnoOfSamples = 8192 ///sresetovani nastaveni bufferu aby se stale nezmensoval if (PSnoOfSamples > PSmaxSamples ) ///check if buffer demand is not higher then capability of the device / kontrola zda neni pozadovan vetsi bufer nez zarizeni zvladne PSnoOfSamples = PSmaxSamples endif ///SET DATA BUFFER PICOStatusSetDataBuffer = ps4000SetDataBuffer(PSHandle,0,PSBufferCHA_rawPointer,PSnoOfSamples) ///handle, channel, buffer, buffer length ////MEASUREMENT while (1) ///opakovani mereni PSReady = 0 ///RUN BLOCK / spusteni mereni Bloku PICOStatusRunBlock = ps4000RunBlock(PSHandle,0,PSnoOfSamples,PSTimebase,1,@PStimeIndisposedMs,0,NULL,NULL) ///handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase, oversample, * timeIndisposedMs, segmentIndex, lpReady, * pParameter PSnoOfSamplesExit= PSnoOfSamples //srovnani velikosti buferu aby se nezmensoval ///IS READY PICOStatusIsReady = ps4000IsReady(PSHandle,@PSReady) ///handle, *PSReady while (PSReady == 0) ////procedura ceka na ukonceni mereni PICOStatusIsReady = ps4000IsReady(PSHandle,@PSReady) delay(0.05) endwhile ///GET VALUES / stazeni hodnot z buferu driveru pro Blok mod PICOStatusGetValues = ps4000GetValues(PSHandle,0,@PSnoOfSamplesExit,1,0,0,@PSoverflow) ///handle, startIndex, * noOfSamples, downSampleRatio, downSampleRatioMode, segmentIndex, * overflow PSBufferCHA_rawWord = PSBufferCHA_raw.getAsWord() V.PICO_CH_A.AddValue = PSBufferCHA_rawWord endwhile PSBufferCHA_raw.free() ///this to be included also in closing PICO close Sequence to freeup memory End Code>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  3. Sorry tge repsonse was> "Class does not exist, can't instantiate.: PICOBlockRead Line 4 - Uncaught error in sequence PICOBlockRead"
  4. Thank you for reply. Looks like the Daq Factory cant find Class "DMemory". Also havent found the DMemory in DAQF help. My code> global PSBufferCHA_raw = new(DMemory) PSBufferCHA_raw.alloc(8192*2) Response> global PSBufferCHA_raw = new(DMemory) PSBufferCHA_raw.alloc(8192*2)
  5. Hello, I woudl appreciate if someone would be able to help me :). Im trying to read Picoscope 4224 IEPE (4000 Series). Im using the ps4000.dll from the Pico SDK. Following their programmer's Guide Im able to connect the unit, also it looks all the functions for the "Block" read mode are returning no errorr messages. However Im not able to get any data into the PSBufferCHA_raw or V.PICO_CH_A, there are only -1 values I set as a baseline. Please see bellow the code for the Block acquisistion. Also attachig the programmer's guide. Thanks, Radek Code>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> /////PICO SCOPE Measurment Block read global PSBufferCHA_raw[8192] = 0 global PSsampleInterval = 20 //Sample time in us / mikrosekund cas pro samplovani - NENI POUZITO, je to jen pro stream, ktery nefunguje global PSTimebase = 500 ///500 is cca 40kHz 20e6/(500-1) global PSsampleInterval_ns = 20 //real sample time ins ns / skutecny samplovaci cas v ns, je pak aktualizovano funkci ..GetTimebase global PStimeIndisposedMs = 0 //real time to take one block / skutecny cas na sebrani jednoho bloku v Ms global PSmaxSamples = 8192 //max no of samples / skutecne mnozstvi samplu ktere umoznuje pamet zarizeni, je pak aktualizovano funkci ..GetTimebase global PSnoOfSamples = 8192 //on entry: the number of samples requested; on exit,the number of samples actually returned, aktualizovano funkci ..GetValues global PSnoOfSamplesExit = 8192 //samples in buffer after data acquisistion /pocet dat buferu po mereni global PSoverflow = 0 //indicate whether an overvoltage has occurred on any of the channels. It is a bit pattern with bit 0 denoting Channel A and bit 1 Channel B. global PSReady = 1 //on exit, indicates the state of the collection. If zero, the device is still collecting. If non-zero, the device has finished collecting and ps4000GetValues can be used to retrieve the data. global PICOStatusRunBlock = -1 global PICOStatusIsReady = -1 global PICOStatusSetDataBuffer = -1 global PICOStatusGetValues = -1 private i = 0 extern("ps4000.dll","long ps4000SetChannel(word, byte, word, word, byte)","ps4000SetChannel","stdcall") //CH A setting / nastaveni kanalu A extern("ps4000.dll","long ps4000GetTimebase(word, ulong, long, long[1], word, long[1], uword)","ps4000GetTimebase","stdcall") ///Time base check / zjisteni Time Base extern("ps4000.dll","long ps4000RunBlock(word, long, long, ulong, word, long[1], uword, long, long[1])","ps4000RunBlock","stdcall") ///spusteni mereni Bloku extern("ps4000.dll","long ps4000GetValues(word, ulong, ulong[1], ulong, word, uword, word[1])","ps4000GetValues","stdcall") ////stazeni hodnot z buferu driveru pro Blok mod extern("ps4000.dll","long ps4000IsReady(word, word[1])","ps4000IsReady","stdcall") extern("ps4000.dll","long ps4000SetDataBuffer(word, word, word[8192], long)","ps4000SetDataBuffer","stdcall") ///registrace data Bufferu A i=0 while (i <= PSnoOfSamples) ///baseline buffer setting -1 set to confirm it is reading something/ vycteni hodnot z bufferu do virtualniho kanalu PSBufferCHA_raw = -1 i=i+1 endwhile ///SET CHANNELS while (PICOStatus != 0) PICOStatus = ps4000SetChannel(PSHandle,0,1,1,8) ///handle, channel, enabled, AC /DC (0/1), range PICOStatus = ps4000SetChannel(PSHandle,1,0,1,8) endwhile ///GET TIME BASE PICOStatus = ps4000GetTimebase(PSHandle,PSTimebase,8192,@PSsampleInterval_ns,1,@PSmaxSamples,0) ///handle, timebase (500 odpovida cca 40kHz 20e6/(500-1)), noSamples, *timeIntervalNanoseconds, oversample, *maxsample, segmentIndex PSnoOfSamples = 8192 ///sresetovani nastaveni bufferu aby se stale nezmensoval if (PSnoOfSamples > PSmaxSamples ) ///check if buffer demand is not higher then capability of the device / kontrola zda neni pozadovan vetsi bufer nez zarizeni zvladne PSnoOfSamples = PSmaxSamples endif ////MEASUREMENT while (1) ///opakovani mereni PSReady = 0 ///RUN BLOCK / spusteni mereni Bloku PICOStatusRunBlock = ps4000RunBlock(PSHandle,0,PSnoOfSamples,PSTimebase,1,@PStimeIndisposedMs,0,NULL,NULL) ///handle, noOfPreTriggerSamples, noOfPostTriggerSamples, timebase, oversample, * timeIndisposedMs, segmentIndex, lpReady, * pParameter PSnoOfSamplesExit= PSnoOfSamples //srovnani velikosti buferu aby se nezmensoval ///IS READY PICOStatusIsReady = ps4000IsReady(PSHandle,@PSReady) ///handle, *PSReady while (PSReady == 0) ////procedura ceka na ukonceni mereni PICOStatusIsReady = ps4000IsReady(PSHandle,@PSReady) delay(0.05) endwhile ///SET DATA BUFFER PICOStatusSetDataBuffer = ps4000SetDataBuffer(PSHandle,0,@PSBufferCHA_raw,PSnoOfSamples) ///handle, channel, buffer, buffer length ///GET VALUES / stazeni hodnot z buferu driveru pro Blok mod PICOStatusGetValues = ps4000GetValues(PSHandle,0,@PSnoOfSamplesExit,1,0,0,@PSoverflow) ///handle, startIndex, * noOfSamples, downSampleRatio, downSampleRatioMode, segmentIndex, * overflow V.PICO_CH_A.AddValue = PSBufferCHA_raw endwhile Code>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> picoscope-4000-series-programmers-guide.pdf