Audacityで波形を表示できるようになったのですが電圧をどう読み取ったら良いかが解りませんでした。オシロスコープの代わりにしようとしているので波形と電圧について調べました。
初めにテスターで測りやすいように正弦波を出力するプログラムを作成しました。
#include <iostream>
#include <windows.h>
#include <math.h>
#include <MMSystem.h>
#pragma comment (lib, "winmm.lib")
constexpr auto SAMPLING = 192000;
constexpr auto CHANNEL = 2;
constexpr auto BITSPERSAMPLE = 16;
constexpr auto MAXAMP = 32767;
int main() {
LPWORD lpWave;
WAVEHDR whdr;
WAVEFORMATEX wfe;
HWAVEOUT hWaveOut;
wfe.wFormatTag = WAVE_FORMAT_PCM;
wfe.nChannels = CHANNEL;
wfe.wBitsPerSample = BITSPERSAMPLE;
wfe.nBlockAlign = CHANNEL * BITSPERSAMPLE / 8;
wfe.nSamplesPerSec = SAMPLING;
wfe.nAvgBytesPerSec = wfe.nSamplesPerSec * wfe.nBlockAlign;
size_t frequency;
DWORD dataLength;
DWORD wavelength;
DWORD i;
std::string str;
std::cout << "周波数を入力しEnterで開始します。" << std::endl;
std::cin >> str;
frequency = std::atoi(str.c_str());
wavelength = (DWORD)SAMPLING / (DWORD)frequency;
dataLength = (DWORD)((size_t)CHANNEL * (BITSPERSAMPLE / 8) * wavelength);
lpWave = (LPWORD)calloc(sizeof(WORD), dataLength);
for (i = 0; i < wavelength; i++) {
lpWave[i * 2] = (WORD)(MAXAMP * sin((i * 6.28318530718) / wavelength));
lpWave[i * 2 + 1] = (WORD)(MAXAMP * sin((i * 6.28318530718) / wavelength));
}
whdr.dwBufferLength = dataLength;
whdr.lpData = (LPSTR)lpWave;
whdr.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
whdr.dwLoops = UINT32_MAX;
waveOutOpen(&hWaveOut, 0, &wfe, 0, 0, CALLBACK_NULL);
waveOutPrepareHeader(hWaveOut, &whdr, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, &whdr, sizeof(WAVEHDR));
std::cout << "何か入力しEnterで終了します。" << std::endl;
std::cin >> str;
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
free(lpWave);
}
このプログラムは入力した周波数の正弦波を左右最大の値で音声出力します。
音量0から10刻みで100まで増やした時の交流電圧です。ピークの算出は√2×1.1をテスターで測った交流電圧値にかけています。使ったテスターの値は多分平均値出力と思いましたので。
音声出力レベル70でピークが±1Vになるようです。
出力側それぞれに4.7KΩの抵抗を並列にして約2.3KΩにしたものを入れて出力値を調整します。
マイクレベル18でピーク±1Vの正弦波をAudacityで表示しました。右側の目盛0.1で1V表示になります。
マイクレベル38でピーク±1Vの正弦波をAudacityで表示しました。右側の目盛0.2で1V表示になります。
可聴範囲に限定ですがデジタルストレージオシロスコープが出来ました。