一种生成假音频可视化器的算法
Posted
技术标签:
【中文标题】一种生成假音频可视化器的算法【英文标题】:An Algorithm for producing fake audio visualizer 【发布时间】:2018-05-16 01:28:58 【问题描述】:有没有人知道生成随机数字序列的算法(如 100 java-byte (>=-127 &
我正在尝试写一个,它有多个 Random 和 Sinus 计算,但结果非常难看,它介于 sinus 波和旧牙刷之间。如果您将代码引导到具有美学说服力的代码,我将非常感激
带有解释(和/或图片)的算法很好。一个伪代码会非常好。一个实际的 JAVA 代码是奖励。 :D
编辑:
这是我现在正在使用的代码。它很复杂,但我基本上是在具有随机幅度的正弦波上添加随机偏差(我不确定这是否是个好主意)。
private static final int FREQ = 7;
private static final double DEG_TO_RAD = Math.PI / 180;
private static final int MAX_AMPLITUDE = 127;
private static final float DEVIATION = 0.1f; // 10 percent is maximum deviation
private void makeSinusoidRandomBytes()
byte[] bytes = new byte[AUDIO_VISUALIZER_DENSITY];
for (int i = 0; i < AUDIO_VISUALIZER_DENSITY; i++)
int amplitude = random.nextInt(MAX_AMPLITUDE) - MAX_AMPLITUDE/2;
byte dev = (byte) (random.nextInt((int) Math.max(Math.abs(2 * DEVIATION * amplitude), 1))
- Math.abs(DEVIATION * amplitude));
bytes[i] = (byte) (Math.sin(i * FREQ * DEG_TO_RAD) * amplitude - dev);
this.bytes = bytes;
【问题讨论】:
您可以发布您的代码或至少是您尝试过的内容的概述吗? @seesharper 好点! 【参考方案1】:真正的声波实际上是不同频率和幅度的正弦波叠加在一起的组合,而不是与正弦波的随机偏差。困难的部分将是选择将产生您主观喜欢的输出的波振幅和频率的组合!然而,大多数声波都有一个基频,然后是一些“适合”该波长的泛音 - 例如,它可能在 3/2 * 基频和 2/3 基频的幅度处具有泛音。通过组合这些泛音并将生成的波形缩放到 -127 - +127 范围,您将获得实际的声波。
以下代码是 C#,但与 Java 足够接近,可以让您有所了解。它来自一个游戏,我需要将许多正弦波组合在一起以创建各种类型的振荡效果:
/// <summary>
/// Return a value between 0 and 1 based on a sine-wave oscillating with a given combination of periods at a given point in time
/// </summary>
/// <param name="time">time to get wave value at</param>
/// <param name="periods">lengths of waves</param>
/// <returns>height of wave</returns>
public static float MultiPulse(float time, params float[] periods)
float c = 0;
foreach (float p in periods)
float cp = (MathHelper.Pi / p) * time;
float s = ((float)Math.Sin(cp) + 1) / 2;
c += s / periods.Length;
return c;
您可能希望对其进行修改,以允许您为要组合的波指定不同的幅度和周期。
通过组合许多变化很大的幅度和周期(频率),您应该通过反复试验能够获得令人信服的结果。
【讨论】:
谢谢伙计。我用你提到的泛音和每个泛音的随机幅度获得了更好的结果。我将发布我的代码并在下一篇文章中发布结果,并接受您对这个想法的回答。【参考方案2】:根据 see sharper 给我的想法,这是我现在正在使用的代码:
int mainAmp = random.nextInt(MAX_AMPLITUDE) - MAX_AMPLITUDE / 2;
int overtoneAmp = random.nextInt(MAX_AMPLITUDE * 2 / 3) - MAX_AMPLITUDE / 3;
int overtone2Amp = random.nextInt(MAX_AMPLITUDE * 4 / 7) - MAX_AMPLITUDE / 2 * 7;
int mainFreq = random.nextInt(7) + 7;
int overtoneFreq = mainFreq * 3 / 2;
int overtone2Freq = mainFreq * 7 / 4;
byte[] bytes = new byte[AUDIO_VISUALIZER_DENSITY];
for (int i = 0; i < AUDIO_VISUALIZER_DENSITY; i++)
bytes[i] = (byte) (Math.sin(i * mainFreq * DEG_TO_RAD) * mainAmp
+ Math.sin(i * overtoneFreq * DEG_TO_RAD) * overtoneAmp
+ Math.sin(i * overtone2Freq * DEG_TO_RAD) * overtone2Amp);
我的应用的主频率在 8 到 15 之间。你可以和那些一起玩。我使用的另外两个泛音是主频率的 (2 - 1/2)x 和 (2 - 1/4)x。您可以添加更多(2 - 1/8)x 等。或使用另一系列频率。我还将幅度随机化,每次都得到一个独特的波。
这些是我使用此代码绘制的一些波浪:
【讨论】:
以上是关于一种生成假音频可视化器的算法的主要内容,如果未能解决你的问题,请参考以下文章