使用AVAudioRecorder测量来制作三角波

时间:2016-02-17 13:00:27

标签: ios objective-c avaudiorecorder waveform

我正在尝试通过测光为录音机制作三角波。我正在使用AVAudioRecorder这意味着快速傅里叶变换在这种情况下不起作用(其次我没有足够的知识如何实现它)。我在github上找到了this project。在这个项目中,作者使用以下等式来制作平滑的正弦波:

test:
  override:
    - cd /home/ubuntu/project/app && bin/behat

如果你考虑这个方程的CGFloat y = scaling * self.maxAmplitude * normedAmplitude * sinf(2 * M_PI *(x / self.waveWidth) * self.frequency + self.phase) + (self.waveHeight * 0.5); 部分,你会发现它是正弦波的方程(wikipedia)。如果我用三角方程(wikipedia)的等式替换这个部分,它仍然会产生正弦波,差别很小。我想以这样的方式改变这个方程,即它产生三角波而不是正弦波。

我的三角波方程看起来像这样:

sinf(2 * M_PI *(x / self.waveWidth) * self.frequency + self.phase)

然后最终y位置由下式计算:

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);

动画看起来也不自然。这个等式的输出是:

enter image description here

由于

1 个答案:

答案 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方法包装了阶段,所以检查出来。希望这会有所帮助,让我知道如果这不起作用,我会尽力帮助。