我想做個程式,通過聲卡產生正弦波,正弦波的大小和頻率可以調節,通過引線可以輸出到我的儀器上(儀器可以繪制圖形,通過圖形大小就可以知道儀器的輸入線是否正常)。請問如何做這樣一個相當于信號發生器的軟體?
uj5u.com熱心網友回復:
聲卡是模擬信號輸出的,正弦波是數字信號,建議采用串口直接輸出uj5u.com熱心網友回復:
就是想要把模擬信號接到儀器上。
uj5u.com熱心網友回復:
我覺得聲卡是不行的,因為聲卡主要為聲音服務,頻率都是比較低的如果需要高頻的輸出的話,還是建議使用專業的 DA 卡
uj5u.com熱心網友回復:
我需要的頻率10Hz就可以了
uj5u.com熱心網友回復:
10Hz可是人聽不到的低音哦,很懷疑聲卡是否有此能力。uj5u.com熱心網友回復:
10khz是有點麻煩,一般音頻作業往往是44kHz,一個周期就只有4個點。uj5u.com熱心網友回復:
10 Hz 倒是可以使用 Waveform Functions 系列函式達到目的查看 waveOutWrite 函式的幫助
uj5u.com熱心網友回復:
謝謝,我查下waveOutWrite幫助
uj5u.com熱心網友回復:
10khz是有點麻煩uj5u.com熱心網友回復:
我發一個自己寫的類吧,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;
}
}
}
//---------------------------------------------------------------------------
uj5u.com熱心網友回復:
樓主把里邊的發生的信號改一下就行了,另外我使用的是8KHz采樣頻率,你最高可以改為200KHz(普通板載聲卡的極限)。uj5u.com熱心網友回復:
很強,很實用uj5u.com熱心網友回復:
太專業!uj5u.com熱心網友回復:
看不懂啊,一點注釋都沒有uj5u.com熱心網友回復:
能解釋下意思么轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/124421.html
標籤:基礎類
上一篇:c++ builder 的service 中執行shellececute 打開chm檔案為什么沒有任何反應
下一篇:新手剛學的c++ 書上有一道例題
