【发布时间】:2014-02-04 22:47:22
【问题描述】:
我一直在编写一个基本的 C 程序来生成一个正弦波并将其写入 STDOUT 以管道到一个过滤器中,我也将编写该过滤器,但我遇到了问题。
我能够产生听起来很干净的正弦波,但频率已关闭。当我听到我正在生成的输出并与真正的信号发生器输出进行比较时,我的频率有点太高了。
C 代码应为作为参数传递给程序的频率或默认为 500Hz 的频率生成原始 16 位有符号立体声 wav @ 44100Hz。
代码的 matlab 版本在这里,(对 Matlab 中的 1 个索引进行了非常轻微的修改,WHY MATHWORKS WHY!?)减去传递给 STDOUT 等,因为我知道它工作正常
CHANNELS = 2; SAMPLING_RATE = 44100; NUM_SAMPLES = 512;
frequency = 1000;
%% BEGIN WHILE(1) LOOP HERE
output_buff = zeros(1,CHANNELS*NUM_SAMPLES);
for i = 1:2:CHANNELS*NUM_SAMPLES
output_buff(i) = 30000 * sin(frequency * pi * (i-1)/NUM_SAMPLES);
output_buff(i+1) = output_buff(i);
end
%% OUTPUT TO STDOUT AND REPEAT
我应该补充一点,这段代码在 while true 循环中运行(在 C 版本中),生成一个完整的 output_buff 值,然后将缓冲区推送到 STDOUT。
我已经编写了一些进一步的测试代码,以查看实际生成的内容如下:
plot(1:CHANNELS*NUM_SAMPLES, output_buff)
output_buff = output_buff .* hanning(length(output_buff))';
Y = fft(output_buff);
Mag=abs(Y(1:length(output_buff)/2)).^2;
[a,b]=max(Mag);
% Result
SAMPLING_RATE*b/length(output_buff)
当我运行这个脚本时,我可以看到最后生成信号的频率实际上是 1.0767e+03Hz... Close but no cigar...
我已经尝试调整一些参数,但我不知道出了什么问题或如何使生成的频率更准确。
C 代码本身在我的 Linux 安装中,如果需要,我可以在明天添加。
【问题讨论】:
-
你的音频输出设备是什么?你知道它的时钟是准确的吗?附:因为 FORTRAN
-
在我的联想 Y510p、3.2GHz i7、16GB RAM 上运行代码,通过系统默认音频系统运行
标签: c matlab audio wav trigonometry