Я реализую фильтр нижних частот в C с библиотекой PortAudio. Я записываю вход микрофона со сценарием из самого PortAudio. Там я добавил следующий код:Фильтр нижних частот в C
float cutoff = 4000.0;
float filter(float cutofFreq){
float RC = 1.0/(cutofFreq * 2 * M_PI);
float dt = 1.0/SAMPLE_RATE;
float alpha = dt/(RC+dt);
return alpha;
}
float filteredArray[numSamples];
filteredArray[0] = data.recordedSamples[0];
for(i=1; i<numSamples; i++){
if(i%SAMPLE_RATE == 0){
cutoff = cutoff - 400;
}
data.recordedSamples[i] = data.recordedSamples[i-1] + (filter(cutoff)*(data.recordedSamples[i] - data.recordedSamples[i-1]));
}
Когда я запускаю этот скрипт в течение 5 секунд, он работает. Но когда я пытаюсь запустить это более 5 секунд, это терпит неудачу. Приложение записывает все, но сбой при воспроизведении. Если я удалю фильтр, приложение будет работать.
Любые советы?
не получают за то, что вам нужно это: 'если (я% SAMPLE_RATE == 0) ...' и вы хотите сделать непрерывную выборку в РТ или образец сначала, затем фильтр? для первого варианта вы не должны фильтровать все образцы, а только новые добавленные ... также вы фильтруете с помощью 'i-1',' i', поэтому вы должны иметь 'i -' in for loop, а не наоборот (вы воздействуете на элемент 'i-1' перед его использованием ... – Spektre
Я пытаюсь сделать фильтр, который будет работать в режиме реального времени, так что мне потребуется непрерывная выборка, я думаю. Первое, если используется, t хочу изменить обрезку каждую секунду 44100 раз, но только один раз. – boortmans
добавил ответ ... ваш основной вопрос, скорее всего, через 5 секунд - это значение отсечки из вашей полезной области (отрицательно) – Spektre