如何编程声卡输出特定信号?

时间:2014-03-16 01:18:38

标签: audio hardware multimedia

我正在尝试对声卡进行编程以输出特定值。

让我们说,我有以下序列

[1,2,3,2,10,4,1,50,20,1]

我希望声卡按照这个顺序输出指定的模拟信号。

我当然可以使用Windows Multimedia API。但是,我的任务很轻,我不想使用这么重的框架。

对此有何建议?

2 个答案:

答案 0 :(得分:0)

我建议你生成一个.wav文件并用媒体播放器播放。

使用python及其wave模块很容易。在我的下面的例子中,我使用python 3.3

import wave
import struct

# define your sequence
frames = [1,2,3,2,10,4,1,50,20,1]

output = wave.open('out.wav', mode='wb') # create the file that will contain your sequence
output.setnchannels(1) # 1 for mono
output.setsampwidth(1) # resolution in number of bytes
output.setframerate(10) # sampling rate, being usually 44100 Hz
output.setnframes(len(frames)) # sequence length

for i in range(0, len(frames)):
    output.writeframes(struct.pack('h',frames[i])) # convert to string in hex format

# close the file, you're done
output.close()

答案 1 :(得分:0)

如果你使用Matlab或免费的等价物Octave,你可以在一行中完成。相关文档为here

soundsc(x, fs, [ lo, hi ])
    Scale the signal so that [lo, hi] -> [-1, 1], then play it
    at sampling rate fs.  If fs is empty, then the default 8000 Hz
    sampling rate is used.

您在控制台中的函数调用看起来像这样......

soundsc([1,2,3,2,10,4,1,50,20,1], fs, [1 50]);

...或者像这样通过手动归一化正整数向量来给出+/- 1 ...

之间的值
x = [1,2,3,2,10,4,1,50,20,1];
x=x-min(x); % get values to range from zero up
x=x/max(x); % get floating point values to range between 0.0 and 1.0
x=x*2-1;    % get values to range between +/- 1.0;
soundsc(x);