关于音频分析仪分享很少,所以积少成多。希望能帮到碰到同样问题的同学们。
在工作中要用到NI的4461音频分析仪,开始用的是华X达的驱动(也就是根据NIDAQmx编写的动态库),但是在使用过程中有很大的局限性。所以还是自己动根据NIDAQmx写程序更顺手一点。
首先分享一下NI的官网关于DAQmx的帮助:http://www.ni.com/white-paper/2835/zhs/ 参考其中的部分函数已经能解决信号的产生和接收问题。
问题一:如何同时打开两个通道?
解答:
首先复制一段代码:
在C/C++中创建任务
DAQmxCreateTask()函数可用于创建任务, DAQmxCreateAIVoltageChan()函数则用于创建模拟输入电压通道。关于创建不同测试类型的通道的信息,请查看“NI-DAQmx C参考帮助”。以下程序片段是这两个函数的应用范例。
TaskHandle taskHandle=0;
char chan[256] = "Dev1/ai0";
float64 min = -10, max = 10;DAQmxCreateTask("",&taskHandle);
DAQmxCreateAIVoltageChan(taskHandle ,chan ,"", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);
本例中只给出了一个通道的倒开方式:char chan[256]="Dev1/aio";
其实要想打开两个通道只需要::char chan[256]="Dev1/aio,“Dev1/ai1";就可以了。很简单。
问题二:如果在音频分析仪中产生双通道不同频率的正弦波?
解答:希望得到答案可以在下面留言。(现在有事,有空再写)
继续:要产生双通道不同频率首先要了解音频分析仪存储数据的结构:间接存储。也就是先存一个波形的点的数据,再存储另外一个波形点的数据
例如:
SinePattern (Number , Value, 0.0, cycles, SineWave1k);//产生波形 其中的参数自己定
SinePattern (Number2 , Value2, 0.0, cycles2, SineWave1k2);
for( i = 0 ; i < Number ; i ++ )
{
SineWave1 [i*2]= SineWave1k[i];
SineWave1 [i*2+1]=SineWave1k2[i];
}
这样数组SineWav1就是在函数中调用的数组:
DAQmxWriteAnalogF64 (AudioOUT, Number, 1, 10.0, DAQmx_Val_GroupByScanNumber, SineWave1, NULL, 0);//注意第五个参数
下面是整个程序部分代码:
int main(void)
{
// int errStatus;
int Number=100,Number2=100,i,a;
double Value=1.0,Value2=2.0;
double cycles=1.0,cycles2=2.0;
double rate=20000.0,rate2=40000.0;
float64 *SineWave1k,*SineWave1k2,*SineWave1;
SineWave1 = (float64 *) malloc (2*Number * sizeof(float64) );
//double SineWave1[2*Number]={0};
SineWave1k = (float64 *) malloc (Number * sizeof(float64) );
SineWave1k2 = (float64 *) malloc (Number2 * sizeof(float64) );
SinePattern (Number , Value, 0.0, cycles, SineWave1k);
SinePattern (Number2 , Value2, 0.0, cycles2, SineWave1k2);
for( i = 0 ; i < Number ; i ++ )
{
SineWave1 [i*2]= SineWave1k[i];
SineWave1 [i*2+1]=SineWave1k2[i];
}
DAQmxClearTask (AudioOUT); // 清除任务
DAQmxCreateTask ("", &AudioOUT);//创建任务
DAQmxCreateAOVoltageChan (AudioOUT, "Dev4/ao0,Dev4/ao1", "", -10.0, 10.0, DAQmx_Val_Volts, "");//创建通道
DAQmxCfgSampClkTiming (AudioOUT, "", rate, DAQmx_Val_Rising,DAQmx_Val_ContSamps, Number);//定时设定
DAQmxWriteAnalogF64 (AudioOUT, Number, 1, 10.0, DAQmx_Val_GroupByScanNumber, SineWave1, NULL, 0);//
free(SineWave1);
free(SineWave1k);
free(SineWave1k2);
DAQmxStopTask(AudioOUT);
DAQmxClearTask(AudioOUT);
DAQmxStopTask(AudioOUT2);
DAQmxClearTask(AudioOUT2);
return 0;
}