0

NI DAQMx ANSI C ライブラリを使用して、wav ファイルに含まれる波形を出力しようとしています。libsnd ライブラリを使用して wav ファイルを読み取り、データを正常に抽出できますが、出力波形の周波数は実際の wav ファイル自体よりもはるかに高くなっています。出力波形の周波数を設定する方法を知っている人はいますか。PCIe 6351 データ収集カードを使用しています。

以下は、このタスクを実行するために私が書いたコードです。

#include<stdio.h>
#include<conio.h>
#include <math.h>
#include <stdlib.h>
#include <windows.h>
#include "NIDAQmx.h"
#include "Sync_AIAO.h"
#include "sndfile.h"
#include "RIB2.h"


int32 fnCreateTask(TaskHandle *AOTaskHandle)
{
    int32 error=0;
    DAQmxErrChk(DAQmxCreateTask("", AOTaskHandle));
    Error:
    return error;
}






int main(int argc, char** argv)
{
    int i=0;
    int32 error=0;
    TaskHandle  AOtaskHandle = 0;
    float64* AIOSample;
    float *fWavSample;
    SNDFILE *SoundFile;
    SF_INFO SoundFileInfo;  
    int iNoOfSamples=0;
    FILE* fp;
    //Error code
    //Handle to the tasks created
    char        errBuff[2048]={'\0'};


    //DAQmxErrChk(DAQmxCreateTask("",AOtaskHandle));
    fnCreateTask(&AOtaskHandle);

    //Create an analog out channel
    DAQmxErrChk (DAQmxCreateAOVoltageChan(*   (&AOtaskHandle),"Dev1/ao1","",-10.0000000,+10.00000,DAQmx_Val_Volts,NULL));

    //Set for 
  //DAQmxErrChk     (DAQmxCfgDigEdgeStartTrig(&AOtaskHandle,"ai/StartTrigger",DAQmx_Val_Rising));


SoundFile=sf_open("sine.wav", SFM_READ, &SoundFileInfo);

  //Check if file is opened sucessfully
  if (SoundFile == NULL)
  {
    printf("Failed to open the file.\n");
    exit(-1);
  }

  //allocate memory for the buffer that is to hold the wav data:
  fWavSample = new float[SoundFileInfo.channels * SoundFileInfo.frames]; 
  iNoOfSamples = SoundFileInfo.channels * SoundFileInfo.frames;

  //Read data into the float structure
  sf_readf_float(SoundFile, fWavSample, SoundFileInfo.frames);

  printf("Float:%d, Float64:%d\n",sizeof(float),sizeof(float64));

  //printf("%f\n",fWavSample[0]);
  //printf("%f\n",fWavSample[200000]);

  AIOSample = new float64[iNoOfSamples];


 // fopen_s(&fp,"output.dat","w");

  for(i=0;i<SoundFileInfo.channels * SoundFileInfo.frames;i++)
  {
     // fprintf(fp,"Data[%d]:%f\n",i,fWavSample[i]);
      AIOSample[i] = (float64)fWavSample[i];

  }

 // fclose(fp);
  int32 written;


  /*calling function that will output the trigger on PFI6*/

  //fnSrPlayElectric(); //play electric stimulus 
  while(1)
  {
      /*
      DAQmxErrChk(DAQmxWriteAnalogF64(AOtaskHandle,(SoundFileInfo.channels * SoundFileInfo.frames), 
      true, 10.0, DAQmx_Val_GroupByChannel,AIOSample,&written,NULL));
      */

      DAQmxErrChk(DAQmxWriteAnalogF64(AOtaskHandle,1000, 
      true, 10.0, DAQmx_Val_GroupByChannel,AIOSample,&written,NULL));

  //Sleep(3000);
  }





//Display the error to the user here.
Error:
    if( DAQmxFailed(error) )
    {
        DAQmxGetExtendedErrorInfo(errBuff,2048);
        puts(errBuff);
    }




getch();
}

私が得ることができる助けをいただければ幸いです。ありがとう!

アトゥル

4

1 に答える 1

2

現在、プログラムは DAQ カードにサンプルを一度に 1 つずつ書き込んでおり、サンプルを 1000 個のグループで送信しています。DAQmx の用語では、これは「ソフトウェア タイミング」タスクです。 、スケジューラ、CPU、およびその他のシステム ダイナミクスは、サンプルがカードに書き込まれる頻度に影響します。

オーディオ ファイルは一定のレートでサンプリングされるため、同じレートでサンプルを生成するように DAQ カードをプログラムする必要もあります。DAQmx 用語では、サンプル クロックを使用することを「ハードウェア タイミング」タスクと呼びます。DAQmx には、サンプルクロックを構成するための ANSI C の例も付属しています [1]。おそらくディスク上では省略名が付けられている「Continuously Generate Voltage - Internal Clock」と、その機能の使用方法を見てみましょうDAQmxCfgSampClkTiming[2]。また、DAQmx オンラインのタイミングの仕組みに関する詳細情報もあります [3]。

たとえば、オーディオ ファイルが 44.1 kHz でサンプリングされている場合、サンプル クロック周波数を同じに設定する必要があります。ただし、6351 のタイムベースは 100 MHz [4] であり、サンプル クロック レートを低くするために整数で分割することに注意してください。したがって、この 44.1 kHz の例では、得られる最も近い周波数は 44.111 kHz (100 MHz / 2267) または 44.091 kHz (100 MHz / 2268) です。構成後、[5]を使用して実際のサンプルレートを確認できDAQmxGetSampClkRateます。DAQmx は有効な値に強制します。

[1] テキストベースの NI-DAQmx データ集録の例 :: ANSI C
http://www.ni.com/white-paper/6999/en/#ANSIC

[2] NI-DAQmx Cリファレンスヘルプ :: DAQmxCfgSampClkTiming
http://zone.ni.com/reference/en-XX/help/370471W-01/daqmxcfunc/daqmxcfgsampclktiming

[3] タイミング、ハードウェア対ソフトウェア
http://zone.ni.com/reference/en-XX/help/370466V-01/TOC11.htm

[4] Xシリーズユーザーマニュアル :: クロックルーティング(183ページ)
http://digital.ni.com/manuals.nsf/websearch/82BB2FBF407E178586257D15006F596C

[5] NI-DAQmx Cリファレンスヘルプ :: DAQmxGetSampClkRate
http://zone.ni.com/reference/en-XX/help/370471W-01/mxcprop/func1344

于 2014-10-02T14:21:15.967 に答える