Пара изменений программирования, прежде всего:
xAxis += pieSteps;
if (xAxis >= fullSinWave)
xAxis -= fullSinWave; //wrap x back into 0-2pi period
поможет уменьшить числовую ошибку.
in_buf[i].r = dataStream[i];
in_buf[i].i = 0;
установит входной буфер на sin(x)
, ранее он был установлен на sin(x) + j*sin(x)
, где j = sqrt(-1)
.
Перемещение wantedHz = 1000;
из цикла выглядит лучше.
И более фундаментальная проблема: вы устанавливаете wantedHz = 1000
. При частоте дискретизации 44,1 кГц это соответствует 44100 points/sec * (1/1000) sec/cycle = 44.1 points/cycle
. С буфером в 512 точек вы получите 11,6 циклов синусоидальной волны в буфере. Нецелые циклы приводят к утечке .
Однако прежде чем приступить к этому, попробуйте установить wantedHz = 12*44100.0/512
, чтобы в буфере было ровно 12 циклов. Вы должны увидеть два пика в преобразовании: один с индексом 12 и один с индексом 511-12.
Причина, по которой вы увидите два всплеска, состоит в том, что преобразование sin(w_0*x)
равно j*{-delta(w-w_0) - delta(w+w_0)}
. То есть вы получаете импульсную функцию в w_0 и -w_0 в мнимой части преобразования. Причина, по которой они находятся в тех местах, в которых они находятся, заключается в том, что преобразование идет от 0 до 2 * пи.
После того, как вы это сделаете, вернитесь к wantedH = 1000
, давая вам нецелое число циклов в буфере. Вы должны увидеть широкий результат в форме палатки, сосредоточенный вокруг контейнеров 11 и 511-11. Вы должны умножить dataStream
на оконную функцию ( Hann - хорошо), чтобы уменьшить влияние этого эффекта.