产生白噪声


15

挑战在于:生成由白噪声组成的音频文件。
要求和说明:

  • 您的程序必须生成仅包含白噪声的音频文件,这意味着其强度在所有(合理的)频率上都是相同的,并且不为零(请参见示例);
  • 一个人必须能够在最新版本的VLC上播放音频文件(在编写答案时);
  • 该程序不需要加密强度高的随机性,rand功能或可以读取的/dev/rand内容;
  • 该程序必须至少能够在理论上产生至少1个小时的音频(这意味着系统限制(例如最大文件大小)不适用);
  • 分数是源代码中的字节数,加上所有适用的奖励;
  • 使用任何第三方,外部库都可以;
  • 该程序必须能够在不访问Internet的情况下运行。

奖金是:

  • -15%:允许指定音频文件的格式(至少两个选择;可能的选择数量不会改变乐谱);
  • -10%:允许指定音频文件的持续时间;
  • -5%:允许指定音频文件的比特率。

这些设置可以存储在变量,文件中,也可以作为命令行参数来选择。百分比是从原始字节数计算得出的,然后再应用任何奖励。


问题规范似乎正在描述代码折叠挑战,但标签则相反。
Undergroundmonorail

哎呀!我会解决的。
Giulio Muscarello 2014年

也许应该将挑战修订为仅允许“现有第三方库”,而不是“任何库”。
jpmc26 2014年

你会成为白色噪音的顽固派吗?如果您真的要验证:其自相关图应在零附近有一个明显的尖峰,而在其他任何延迟下几乎没有。如果您不想成为糊涂者,那么我说将其指定为白噪声是没有意义的。只是说噪音。
Tim Seguine 2014年

WebAudioAPI呢?我编写的JS程序,播放白噪声
ЕвгенийНовиков

Answers:


4

MATLAB,25岁

wavwrite(rand(8e3,1),'a')

将新的WAV文件写入名为的磁盘a。它的采样率为8 kHz,每个采样为16位(带符号整数格式)。源数据均匀地分布在interval上[0,1],该间隔[0,32767]在转换为整数格式后映射到该间隔。

MATLAB,28-4(10%+ 5%)= 24

我不确定OP如何将设置存储在变量中意味着什么,但是我以对这种情况有利的方式对其进行了解释。假如说:

  • 用户在变量中提供所需的比特率(以比特/秒为单位)b。每个样本的位硬编码为16。

  • 文件的所需持续时间(以样本为单位)在变量中给出d

结果是:

wavwrite(rand(d,1),b/16,'a')

MATLAB,16-4(15%+ 10%)= 12

为了追求红利,又增加了一层层次,我做了另一个假设:用于输出文件的所需函数应在变量中指定f。然后,代码简化为:

f(rand(d,1),'a')

该函数的允许值为:

f = @wavwrite

要么

f = @auwrite

每个功能都会导致上述代码段以.au指定的持续时间以8 kHz的采样率写出适当格式(WAV或)的文件。我在这里获得了指定比特率的好处,因为auwrite默认情况下每个样本默认为8位,而不是16位wavwrite。我看不出在不使用更多字符的情况下协调两者的方法。


10

Bash,34岁

dd if=/dev/sda of=file.wav count=1

如果您不希望硬盘“随机”,(慢很多)

dd if=/dev/random of=file.wav count=9

旋转28

word x=0
repeat
 word[?x]=?x

4
不知何故,我不认为文件头可以是完全随机的/与硬盘驱动器的第一个扇区相同
John Dvorak 2014年

1
如果测试工具是VLC,Herr Doctor可能是正确的。VLC非常宽容。
Jonathan Van Matre 2014年

1
您已经产生了噪音,但是是白噪音吗?
斯蒂芬·梅尔文2014年

1
/ dev / random在Mac上也存在,是的!不幸的是,iTunes无法播放生成的wav文件。并不是我可以抱怨-我选择VLc是因为它的宽恕和大量本机编解码器。
Giulio Muscarello 2014年

1
当工作目录为时,通过执行命令可以保存五个字符/dev
David Richerby 2014年

4

Mathematica 52-5 = 47

g导出s秒和8000 bps 的白噪声.wav文件。

g@s_:=Export["p.wav",RandomReal@{-1,1}~Play~{t,0,s}]

示例:导出6秒的白噪声文件。

g[6]

波峰


4

超级对撞机,89-10%= 80.1字节

遗憾的是,尽管故意将其用于生成声音/音频,但这种语言在这里并不会赢得胜利。但这是Supercollider在Code Golf上的首次亮相,太酷了!

这种提交的损失主要是因为设置录制并使其实现是一个冗长的过程,这是由于该语言的客户端/服务器设计所致。仍然,这是一种很酷的语言,当您要求执行此操作时,只需很少的代码即可实现比单纯的白噪声更复杂的事情。

通过更改wait()值来设置文件持续时间。我可以将其放在变量中,但是由于Supercollider没什么可说的,所以这真的没有意义。交互是在服务器仍在播放时实时操作代码。本质上,IDE I / O(除非您为创建的内容构建UI)。

这是高尔夫球版:

{WhiteNoise.ar(1)}.play;s.prepareForRecord;Routine.run{s.record;wait(99);s.stopRecording}

这是一个高尔夫版本,可以选择以aiff或wav记录,并指定样本格式(int16,int8和float是所有选项)。不幸的是,即使有所有奖金,上述版本的效果也更好。这将是139-30%= 97.3字节。

s.recSampleFormat='int16';s.recHeaderFormat='wav';{WhiteNoise.ar(1)}.play;s.prepareForRecord;Routine.run{s.record;wait(99);s.stopRecording}

这是后者的简化版本,因此您可以看到发生了什么。

s.recSampleFormat='int16';
s.recHeaderFormat='wav';

{WhiteNoise.ar(1)}.play;
s.prepareForRecord;

Routine.run{
    s.record;
    wait(99);
    s.stopRecording
}

一票使用超级对撞机。还有很多其他难题,这将是伟大的。查看音乐音频
不是查尔斯(Charles)

4

Bash + ALSA,得分:44(52个字符-(10%+ 5%)奖金)

比其他bash答案更长,但可以接受持续时间和比特率。还向文件添加了一个合理正确的头,因此应该具有可移植性:

arecord -r$2|head -c44;head -c$[$2*$1] /dev/urandom

另存为脚本,chmod +x然后运行:

$ ./wav.sh 1 44100 > c.wav
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 44100 Hz, Mono
$ 

注意,.wav输出是到stdout的,因此必须将其重定向到文件。


由于不需要速度,因此通过读取/ dev / random而不是/ dev / urandom可以节省大约1,20个字符。
Giulio Muscarello 2014年

1
输出标准输入
user253751

0

C 127115字节

#define H htonl
main(c){for(write(1,(int[]){H(779316836),H(24),-1,H(2),H(8000),H(1)},24);;write(1,&c,1))c=rand();}

大部分代码为* .au文件写标题。这会打印出伪随机声音文件以进行标准输出。

可以通过更改来调整采样率8000

ctrl-c您可以在想要停止的时间点击打来调整持续时间:-)


0

JavaScript,167个字节

注意:运行前请减小音量。白噪声令人讨厌

不要生成文件,也许不是预期的。

-4字节 hack播放噪声仅在左声道

c=new AudioContext()
n=c.createScriptProcessor(s=512)
n.connect(c.destination)
n.onaudioprocess=e=>{a=s;while(a--){e.outputBuffer.getChannelData(0)[a]=Math.random()}}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.