2016-02-17 4 views
3

Я пытаюсь сделать треугольные волны для аудиомагнитофона через измерение. Я использую AVAudioRecorder, это означает, что быстрое преобразование Фурье не будет работать в этом случае (во-вторых, у меня недостаточно знаний о том, как его реализовать). Я нашел this project на github. В этом проекте автор использует следующее уравнение, чтобы сделать гладкую синусоиду:Использовать измерение AVAudioRecorder, чтобы сделать треугольную волну

CGFloat y = scaling * self.maxAmplitude * normedAmplitude * sinf(2 * M_PI *(x/self.waveWidth) * self.frequency + self.phase) + (self.waveHeight * 0.5); 

Если рассматривать эту sinf(2 * M_PI *(x/self.waveWidth) * self.frequency + self.phase) части уравнения вы увидите, что это уравнение синусоиды (wikipedia). Если я заменил эту часть уравнением треугольного уравнения (wikipedia), он все еще делает синусоидальную волну с небольшой разницей. Я хочу преобразовать это уравнение таким образом, чтобы вместо синусоидальной волны формировалась треугольная волна.

Мой треугольник волновое уравнение выглядит следующим образом:

CGFloat t = x/self.waveWidth; 
CGFloat numerator = sinf((2.0 * M_PI * (2.0 * self.amplitude + 1.0) * self.frequency * t)); 
CGFloat denominator = (2.0 * self.amplitude + 1.0) * (2.0 * self.amplitude + 1.0); 
CGFloat multiplyer = (8.0/pow(M_PI, 2.0)); 
CGFloat result = multiplyer * (numerator/denominator); 

Тогда, наконец, у позиции вычисляется по формуле:

y = (result * scaling * self.maxAmplitude * normedAmplitude) + (self.waveHeight * 0.5); 

Анимация также выглядят неестественно. Вывод этого уравнения:

enter image description here

Благодаря

+0

Подождите, чтобы вы хотели создать треугольную волну в соответствии с микрофонным входом (входная частота, амплитуда и т. Д.)? Что такое waveWidth в уравнении, которое вы используете? –

+0

Если вы посмотрите в коде «Waver», вы увидите, что waveWidth равен ширине представления. –

+0

Просто хотите уточнить, вы уже пытались вставить треугольную волну, но вы все еще получаете форму синусоиды? –

ответ

2

Ну, посмотрев на уравнение вы используете (который является преобразованием Фурье), вы реализуете это немного неправильно (образцы K должны .., растут, но вы оставили его постоянной с 2.0 * self.amplitude + 1.0 вы также выходить из (-1)^k, который добавляет в нечетных гармониках

Википедия написала это:

Можно приблизить треугольную волну с аддитивным синтезом путем добавления нечетных гармоник фундаментального умножения каждой (4n-1) -й гармоники на -1 (или изменения ее фазы на π) и откатывания гармоник на обратную квадрат их относительной частоты к фундаментальному.

Я предполагаю (поскольку я не эксперт DSP), потому что вы оставляете значение k как константу, это просто дает вам выход синусоидальной волны.

Посмотрите на этот алгоритм блок для треугольной волны (попробуйте, а затем изменить его для вашего кода):

phaseIncr = (2.0 * M_PI/sample_rate) * self.frequency; 
for (int i = 0; i < numSamples; i++) { 
    triVal = (phase * 2.0/M_PI); 
    if (phase < 0) triVal = 1.0 + triVal; 
    else triVal = 1.0 - triVal; 
    sample = amplitude * triVal; 
    if ((phase += phaseIncr) >= M_PI) phase -= (2.0 * M_PI); 
} 

Я также вижу, что первоначальный проект завернутые фазы в setLevel методом, так это проверить. Надеюсь, что это поможет, и дайте мне знать, если это не сработает, я постараюсь помочь как можно больше.

+0

Благодарим вас за подробный ответ. Вы пытались реализовать вышеупомянутый алгоритм в примере проекта? Я также отправлю gif моего вывода. –

+0

@MuhammadZeeshan Извините, у меня не было возможности это сделать, но если вам все еще нужна помощь в реализации, я попробую с моей стороны, просто занят! –

 Смежные вопросы

  • Нет связанных вопросов^_^