SuperCollider:振荡器的自动相位和频率对齐

时间:2013-04-29 17:39:47

标签: tracking phase supercollider

任何人都有自动相位和频率对齐的想法吗?

解释:假设,你有一个冲动

in = Impulse.ar(Rand(2, 5), Rand(0, 1));

现在我想操纵另一个Impulse的频率,使其适应其相位和频率以匹配输入。 任何建议,即使是谷歌搜索也非常受欢迎。

[代表同事提出的问题]

3 个答案:

答案 0 :(得分:1)

我不同意这一点,因为框架是一个棘手的问题。脉冲很容易跟踪 - 这就是为什么,例如,旧的旋转拨号电话使用脉冲序列。

这是一些在随机频率上产生脉冲的代码,然后以相同的频率重新合成另一个脉冲。它还输出音高估计值。

(
var left, right, master, slave, periodestimatebus, secretfrequency;
s = Server.default;
left = Bus.new(\audio, 0,1);
right = Bus.new(\audio, 1,1);
periodestimatebus = Bus.control(s,1);
//choose our secret frequency here for later comparison:
secretfrequency = rrand(2.0,5.0);

//generate impulse with secret frequency at some arbitrary phase
master = {Impulse.ar(secretfrequency, Rand(0, 1));}.play(s, left);

slave = {
    var masterin, clockcount, clockoffset, syncedclock, periodestimate, tracking;
    masterin = In.ar(left);
    //This 1 Hz LFSaw is the "clock" against which we measure stuff
    clockcount = LFSaw.ar(1, 0, 0.5, 0.5);
    clockoffset = Latch.ar(clockcount, Delay1.ar(masterin));
    syncedclock = (clockcount - clockoffset).frac;
    //syncedclock is a version of the clock hard-reset (one sample after) every impulse trigger
    periodestimate = Latch.ar(syncedclock, masterin);
    //sanity-check our f impulse
    Out.kr(periodestimatebus, periodestimate);
    //there is no phase estimate per se - what would we measure it against? -
    //but we can resynthesise a new impulse up to a 1 sample delay from the matched clock.
    tracking = (Slope.ar(syncedclock)>0);
}.play(master, right, 0, addAction: \addAfter);

//Let's see how we performed
{
    periodestimatebus.get({|periodestimate|
        ["actual/estimated frequency", secretfrequency, periodestimate.reciprocal].postln;
    });
}.defer(1);
)

此代码的注释:

periodestimate是由Delay1的狡猾使用生成的,以确保它在重置之前只是的时钟值。因此,它是一个样本。

当前实施将产生具有变化频率的良好周期估计,至少低至1Hz。任何更低的,您需要更改clockcount时钟以具有不同的频率并调整算术。

许多改进都是可能的。例如,如果您希望跟踪不同的频率,您可能需要稍微调整一下,以便重新合成的信号不会频繁点击,因为它低估了信号。

答案 1 :(得分:0)

这是一个棘手的问题,因为您正在处理频率较低的噪声源。如果这是一个正弦波,我建议使用FFT,但FFT对噪声源和低频率的效果不佳。它仍然值得一试。 FFT也可以匹配相位。我相信你可以使用pitch.ar来帮助找到频率。

Chrip-Z算法可以用来代替FFT - http://www.embedded.com/design/configurable-systems/4006427/A-DSP-algorithm-for-frequency-analysis http://en.wikipedia.org/wiki/Bluestein%27s_FFT_algorithm

你可以尝试的另一件事是使用神经网络尝试猜测它是否正确的信息。您可以使用主动培训来帮助实现这一目标。在SO上有一个非常普遍的讨论: Pitch detection using neural networks

有些人正在研究的一种方法是模拟耳蜗的神经元来检测音高。

答案 2 :(得分:0)

您可能想要阅读锁相环:http://en.wikipedia.org/wiki/Phase-locked_loop