【问题标题】:Use AVAudioRecorder metering to make triangular wave使用AVAudioRecorder测光制作三角波
【发布时间】:2016-02-17 13:00:26
【问题描述】:

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

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位置的计算公式为:

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

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

谢谢

【问题讨论】:

  • 等一下,您想根据麦克风输入(输入频率、幅度等)生成三角波吗?您所依据的方程式中的 waveWidth 是什么?
  • 如果你查看代码'Waver',你会发现waveWidth等于视图的宽度。
  • 只是想澄清一下,您已经尝试放入三角波,但您仍然得到正弦波形状?
  • 是的!但波的幅度变小了。
  • 这是一个疯狂的镜头,但是当你增加振幅时发生了什么?我可以看看你的三角波方程吗?

标签: ios objective-c avaudiorecorder waveform


【解决方案1】:

好吧,看看你正在使用的方程(这是傅立叶变换),你实现它有点错误(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 方法中,因此请检查一下。希望这对您有所帮助,如果这不起作用,请告诉我,我会尽力提供帮助。

【讨论】:

  • 感谢您的详细解答。您是否尝试在示例项目中实现上述算法?我还将发布我的输出的 gif。
  • @MuhammadZeeshan 对不起,我没有机会这样做,但如果你仍然需要帮助来实施它,我会从我这边尝试,只是很忙!
猜你喜欢
  • 1970-01-01
  • 2021-02-01
  • 2018-10-31
  • 1970-01-01
  • 2021-11-07
  • 2011-01-31
  • 2021-07-11
  • 1970-01-01
  • 2015-08-10
相关资源
最近更新 更多