我正在为数字信号处理编写信号源,发现了奇怪的行为.以下是代码:
float complex *output = malloc(sizeof(float complex) * 48000);
FILE *f = fopen("test_signal.cf32", "wb");
int64_t freq = -3355;
float phase_increment = 2 * (float) M_PI * (float) freq / 48000;
float phase = 0.0F;
for (int i = 0; i < 150 * 5; i++) {
for (int j = 0; j < 9600; j++) {
output[j] = cosf(phase) + sinf(phase) * I;
phase += phase_increment;
}
fwrite(output, sizeof(float complex), 9600, f);
}
fclose(f);
它将创建一个复杂信号从中心偏移-3355hz的文件.所以,当我在这个文件上运行FFT时,我期望信号为-3355hz.由于量化,在这个数字周围有一些微小的频率分布.但实际上,我得到了以下信息:
在50秒左右有一个相当明显的频率跳变(~2000hz).
Anyone knows why?
我的实验表明:
- 使用double for the
phase
有帮助 - 将参数从-2pi减少到2pi会有所帮助
- 苹果M1和覆盆子皮有同样的 skip
-
phase
的论点似乎没有溢出 - 有趣的阅读https://randomascii.wordpress.com/2014/10/09/intel-underestimates-error-bounds-by-1-3-quintillion/,但不太可能导致频率突然跳变