任何人都有自动相位和频率对齐的想法吗?
解释:假设,你有一个冲动
in = Impulse.ar(Rand(2, 5), Rand(0, 1));
现在我想操纵另一个Impulse的频率,使其适应其相位和频率以匹配输入。 任何建议,即使是谷歌搜索也非常受欢迎。
[代表同事提出的问题]
答案 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)