我正在尝试通过测光为录音机制作三角波。我正在使用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);
动画看起来也不自然。这个等式的输出是:
由于
答案 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
方法包装了阶段,所以检查出来。希望这会有所帮助,让我知道如果这不起作用,我会尽力帮助。