gpt4 book ai didi

c - 从基础知识在 C/Matlab 中生成正弦波的麻烦

转载 作者:行者123 更新时间:2023-11-30 17:40:16 26 4
gpt4 key购买 nike

我一直在编写一个基本的 C 程序来生成正弦波并将其写入 STDOUT,以便通过管道传输到滤波器中,我也将编写该程序,但我遇到了问题。

我能够生成听起来像是干净的正弦波,但频率不正确。当我听我生成的输出并与真实信号发生器的输出进行比较时,我的频率稍微太高了。

C 代码应生成原始 16 位带符号立体声 wav @ 44100Hz,频率作为参数传递给程序,或默认为 500Hz。

代码的 matlab 版本在这里,(对 Matlab 中的 1 索引进行了轻微修改,为什么 MATHWORKS 为什么!?)减去传递给 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...关闭但没有雪茄...

我尝试调整一些参数,但我不知道出了什么问题,也不知道如何使生成的频率更准确。

C 代码本身就在我的 Linux 安装上,如果需要的话我可以明天添加。

最佳答案

您正在处理数字信号处理,这是一个复杂的领域,并且有一个 dsp stackexchange专门针对它的网站。我的建议是:

  • 如果您想要输出完全您输入的内容,请选择生成采样率除以 2 的幂的频率,例如 44100/44 = 1002.272727... 在这种情况下,长度为 2 的幂的样本将完全适合您的 FFT 输入。

  • 如果您想要更好的 FFT 结果,请尝试将样本数量增加到 4096 或 8192。因为采样率为 44,100Hz 时的 512 个样本意味着您有 512/44,100=~ 11.61毫秒的信号......所以这意味着你的正弦波数量不完整。 1000 Hz 的一个完整正弦波正好是 1 ms。周期数不完整可能会导致 FFT 产生近似误差。

关于c - 从基础知识在 C/Matlab 中生成正弦波的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21565171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com