R:产生频率可变的正弦波
R: Generate sine wave with variable frequency
这可能更像是一道数学题,而不是 R 题,但这里是...
我正在尝试生成一个低频振荡器 (LFO2),其中的频率由另一个低频振荡器 (LFO1) 控制。 LFO1 的频率为 0.02 Hz,而我希望 LFO2 的频率在 0.00 和 0.11 Hz 之间振荡,具体取决于 LFO1 的输出。
# length in seconds
track_length <- 356
upsample <- 10 # upsample the signal
# LFO rates (Hz)
rate1 <- 0.02
rate2_range <- list(0.00, 0.11)
# make plot of LFO1
x1 <- 1:(track_length*upsample)/upsample
amp <- (rate2_range[[2]] - rate2_range[[1]])/2
y1 <- amp*cos(2*pi*rate1*x1) + amp
plot(x1, y1, type='l')
LFO1 生成的 LFO2 的可变频率看起来完全符合我的预期。
所以我继续像这样使用 LFO1 的输出制作 LFO2..
# make plot of LFO2
x2 <- x1
y2 <- cos(2*pi*y1*x2)
plot(x2, y2, type='l')
然而,LFO2 的输出并不是我所期望的...它似乎在不断变快,并且还有一些峰值不会在整个范围内振荡。我不明白这一点,因为我唯一要调整的是频率,它不应该快于 0.11 赫兹。起初我认为这可能是一个采样不足的问题,但在对时间序列进行任何程度的上采样时,我得到了相同的结果。
知道我在这里遗漏了什么吗?
cos(f(t))的"frequency"不是f(t)。它是 f(t) 的 导数 。
你有:
y1(t) = A*cos(2πf1t) + A
y2(t) = cos(2πy1(t))
如果您想要的频率是 Acos(2πf1t) + A,那么您需要对其进行积分以获得参数到 cos:
y1(t) = A*sin(2πf1t)/2πf1 + 在
y2(t) = cos(2πy1(t))
在 R 中:
# length in seconds
track_length <- 356
upsample <- 10 # upsample the signal
# LFO rates (Hz)
rate1 <- 0.02
rate2_range <- list(0.00, 2)
# make integral of LFO1
x1 <- 1:(track_length*upsample)/upsample
amp <- (rate2_range[[2]] - rate2_range[[1]])/2
y1 <- amp*sin(2*pi*rate1*x1)/(2*pi*rate1) + amp*x1
plot(x1, y1, type='l')
# make plot of LFO2
x2 <- x1
y2 <- cos(2*pi*y1 / upsample)
plot(x2, y2, type='l')
您没有像在第一个图中那样通过放大器限制数据。所以看到 cos 输出在 -1 左右变化是正常的,1.You 需要通过 max(y1)
和 min(y1)
.
来限制公式
所以下面的代码,
y2 <- vector()
amp <- (max(y1) - min(y1))/2
for(i in 1:length(y1)) {
y2[i] <- amp * cos(2*pi* y1[i] * x2) + amp
}
plot(x2, y2, type='l',col="blue")
grid(nx = NULL, ny = NULL, col = "lightgray", lty = "dotted")
给出这个情节,
这可能更像是一道数学题,而不是 R 题,但这里是...
我正在尝试生成一个低频振荡器 (LFO2),其中的频率由另一个低频振荡器 (LFO1) 控制。 LFO1 的频率为 0.02 Hz,而我希望 LFO2 的频率在 0.00 和 0.11 Hz 之间振荡,具体取决于 LFO1 的输出。
# length in seconds
track_length <- 356
upsample <- 10 # upsample the signal
# LFO rates (Hz)
rate1 <- 0.02
rate2_range <- list(0.00, 0.11)
# make plot of LFO1
x1 <- 1:(track_length*upsample)/upsample
amp <- (rate2_range[[2]] - rate2_range[[1]])/2
y1 <- amp*cos(2*pi*rate1*x1) + amp
plot(x1, y1, type='l')
LFO1 生成的 LFO2 的可变频率看起来完全符合我的预期。
所以我继续像这样使用 LFO1 的输出制作 LFO2..
# make plot of LFO2
x2 <- x1
y2 <- cos(2*pi*y1*x2)
plot(x2, y2, type='l')
然而,LFO2 的输出并不是我所期望的...它似乎在不断变快,并且还有一些峰值不会在整个范围内振荡。我不明白这一点,因为我唯一要调整的是频率,它不应该快于 0.11 赫兹。起初我认为这可能是一个采样不足的问题,但在对时间序列进行任何程度的上采样时,我得到了相同的结果。
知道我在这里遗漏了什么吗?
cos(f(t))的"frequency"不是f(t)。它是 f(t) 的 导数 。 你有:
y1(t) = A*cos(2πf1t) + A
y2(t) = cos(2πy1(t))
如果您想要的频率是 Acos(2πf1t) + A,那么您需要对其进行积分以获得参数到 cos:
y1(t) = A*sin(2πf1t)/2πf1 + 在
y2(t) = cos(2πy1(t))
在 R 中:
# length in seconds
track_length <- 356
upsample <- 10 # upsample the signal
# LFO rates (Hz)
rate1 <- 0.02
rate2_range <- list(0.00, 2)
# make integral of LFO1
x1 <- 1:(track_length*upsample)/upsample
amp <- (rate2_range[[2]] - rate2_range[[1]])/2
y1 <- amp*sin(2*pi*rate1*x1)/(2*pi*rate1) + amp*x1
plot(x1, y1, type='l')
# make plot of LFO2
x2 <- x1
y2 <- cos(2*pi*y1 / upsample)
plot(x2, y2, type='l')
您没有像在第一个图中那样通过放大器限制数据。所以看到 cos 输出在 -1 左右变化是正常的,1.You 需要通过 max(y1)
和 min(y1)
.
所以下面的代码,
y2 <- vector()
amp <- (max(y1) - min(y1))/2
for(i in 1:length(y1)) {
y2[i] <- amp * cos(2*pi* y1[i] * x2) + amp
}
plot(x2, y2, type='l',col="blue")
grid(nx = NULL, ny = NULL, col = "lightgray", lty = "dotted")
给出这个情节,