Кто-нибудь знает алгоритм для создания случайной последовательности чисел (например, 100 java-байт (>=-127 и ‹= 127)), которые, когда они нарисованы в виде гистограммы, будут похожи на обычный звуковой спектр, как те, что SoundCloud те?
Я пытаюсь написать один, он имеет несколько вычислений Random и 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;
}