2016-02-17 24 views
3

我正在尝试通过测光为录音机制作三角波。我正在使用AVAudioRecorder,这意味着在这种情况下快速傅立叶变换将不起作用(其次,我没有足够的知识来实现​​它)。我在github上发现了this project。在这个项目中笔者使用的是下面的公式,使平滑的正弦波:使用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)代替这部分,它仍然会产生正弦波,差别不大。我想以这样一种方式来转换这个方程,即它使三角波代替正弦波。

我的三角波方程如下:

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

动画也看起来不自然:

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位置的计算方法。这个方程的输出是:

enter image description here

感谢

+0

等等,您希望根据麦克风输入(输入频率,幅度等)生成三角波吗?什么是您正在建立这个关系的方程中的波宽? –

+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对不起,我没有得到它的机会,但如果你仍然需要帮助实施它,我会尝试从我身边,只是忙! –