如何用声卡做个信号发生器?

FlySkyFree 2011-12-19 02:35:07
我想做个程序,通过声卡产生正弦波,正弦波的大小和频率可以调节,通过引线可以输出到我的仪器上(仪器可以绘制图形,通过图形大小就可以知道仪器的输入线是否正常)。请问如何做这样一个相当于信号发生器的软件?
...全文
724 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
追jay迷 2014-04-11
  • 打赏
  • 举报
回复
能解释下意思么
追jay迷 2014-04-11
  • 打赏
  • 举报
回复
看不懂啊,一点注释都没有
aranjuze 2011-12-31
  • 打赏
  • 举报
回复
太专业!
xjq2003 2011-12-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 borlandsun 的回复:]
我发一个自己写的类吧,7年前做的了,那时我还没和女友分手,也不认识现在的老婆。

C/C++ code

//---------------------------------------------------------------------------
#ifndef TAudioIOH
#define TAudioIOH
//------------------------……
[/Quote]很强,很实用
BORLANDSUN 2011-12-30
  • 打赏
  • 举报
回复
楼主把里边的发生的信号改一下就行了,另外我使用的是8KHz采样频率,你最高可以改为200KHz(普通板载声卡的极限)。
BORLANDSUN 2011-12-30
  • 打赏
  • 举报
回复
我发一个自己写的类吧,7年前做的了,那时我还没和女友分手,也不认识现在的老婆。

//---------------------------------------------------------------------------
#ifndef TAudioIOH
#define TAudioIOH
//---------------------------------------------------------------------------
#include "Main.h"
#include <mmsystem.h>
//本类用于声卡两个声道的输出,用于两路电源的开关控制
class TAudioIO
{
private:
Byte* _Output; //输出信号
WAVEFORMATEX _WaveFormatEx;
HWAVEOUT _hWaveOut;
WAVEHDR _lpHdrOut;
public:
Byte* _Input; //输入信号
public:
TAudioIO(void);
~TAudioIO(void);
void AudioOutStart(void);
void AudioOutStop(void);
void SetRCOutput(bool); //设置右通道输出数据,参数为true时为高电平,反之为低电平
void SetLCOutput(bool); //设置左通道输出数据,参数为true时为高电平,反之为低电平
};
//---------------------------------------------------------------------------
#endif


//---------------------------------------------------------------------------
#pragma hdrstop
#include "TAudioIO.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
TAudioIO::TAudioIO(void)
{
_WaveFormatEx.wFormatTag = WAVE_FORMAT_PCM;
_WaveFormatEx.nChannels = 2;
_WaveFormatEx.wBitsPerSample = 8;
_WaveFormatEx.cbSize = 0;
_WaveFormatEx.nSamplesPerSec = 8000;
_WaveFormatEx.nAvgBytesPerSec = _WaveFormatEx.nChannels * _WaveFormatEx.nSamplesPerSec * _WaveFormatEx.wBitsPerSample/8;
_WaveFormatEx.nBlockAlign = _WaveFormatEx.nChannels * _WaveFormatEx.wBitsPerSample/8;
_Output = new Byte[_WaveFormatEx.nSamplesPerSec*2];
memset(_Output,0,_WaveFormatEx.nSamplesPerSec*2);
_lpHdrOut.lpData = _Output;
_lpHdrOut.dwBufferLength = _WaveFormatEx.nSamplesPerSec * _WaveFormatEx.nBlockAlign;
_lpHdrOut.dwFlags = WHDR_BEGINLOOP|WHDR_ENDLOOP;
_lpHdrOut.dwLoops = 0xFFFFFFFF;
_hWaveOut = NULL;
}
//---------------------------------------------------------------------------
TAudioIO::~TAudioIO(void)
{
AudioOutStop();
delete[] _Output;
}
//---------------------------------------------------------------------------
void TAudioIO::AudioOutStart(void)
{
waveOutOpen(&_hWaveOut,WAVE_MAPPER,&_WaveFormatEx,0,0,0);
waveOutPrepareHeader(_hWaveOut,&_lpHdrOut,sizeof(WAVEHDR));
waveOutWrite(_hWaveOut,&_lpHdrOut,sizeof(WAVEHDR));
}
//---------------------------------------------------------------------------
void TAudioIO::AudioOutStop(void)
{
waveOutReset(_hWaveOut);
waveOutClose(_hWaveOut);
waveOutUnprepareHeader(_hWaveOut,&_lpHdrOut,sizeof(WAVEHDR));
}
//---------------------------------------------------------------------------
void TAudioIO::SetRCOutput(bool VTag)
{
if(VTag == true)
{
for(unsigned int i=0;i<_WaveFormatEx.nSamplesPerSec;i++)
{
_Output[i*2+1] = 255;
}
}
else
{
for(unsigned int i=0;i<_WaveFormatEx.nSamplesPerSec;i++)
{
_Output[i*2+1] = 0;
}
}
}
//---------------------------------------------------------------------------
void TAudioIO::SetLCOutput(bool VTag)
{
if(VTag == true)
{
for(unsigned int i=0;i<_WaveFormatEx.nSamplesPerSec;i++)
{
_Output[i*2] = 255;
}
}
else
{
for(unsigned int i=0;i<_WaveFormatEx.nSamplesPerSec;i++)
{
_Output[i*2] = 0;
}
}
}
//---------------------------------------------------------------------------
lctqzq 2011-12-29
  • 打赏
  • 举报
回复
10khz是有点麻烦
qiushenwei88 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 behard 的回复:]

10 Hz 倒是可以使用 Waveform Functions 系列函数达到目的
查看 waveOutWrite 函数的帮助
[/Quote]

谢谢,我查下waveOutWrite帮助
lhy 2011-12-20
  • 打赏
  • 举报
回复
10khz是有点麻烦,一般音频工作往往是44kHz,一个周期就只有4个点。
cankoo 2011-12-20
  • 打赏
  • 举报
回复
10Hz可是人听不到的低音哦,很怀疑声卡是否有此能力。
FlySkyFree 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 behard 的回复:]

我觉得声卡是不行的,因为声卡主要为声音服务,频率都是比较低的
如果需要高频的输出的话,还是建议使用专业的 DA 卡
[/Quote]

我需要的频率10Hz就可以了
Behard 2011-12-20
  • 打赏
  • 举报
回复
10 Hz 倒是可以使用 Waveform Functions 系列函数达到目的
查看 waveOutWrite 函数的帮助
Behard 2011-12-19
  • 打赏
  • 举报
回复
我觉得声卡是不行的,因为声卡主要为声音服务,频率都是比较低的
如果需要高频的输出的话,还是建议使用专业的 DA 卡
FlySkyFree 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhiyuandigital 的回复:]

声卡是模拟信号输出的,正弦波是数字信号,建议采用串口直接输出
[/Quote]

就是想要把模拟信号接到仪器上。
zhiyuandigital 2011-12-19
  • 打赏
  • 举报
回复
声卡是模拟信号输出的,正弦波是数字信号,建议采用串口直接输出

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧