音调生成器 - 音频频率与波形生成器 在线工具
生成20Hz至20kHz范围的正弦波、方波、锯齿波和三角波音调。实时波形和频谱可视化、多音调混合、音符显示 — 基于Web Audio API的100%客户端处理。
保护您的耳朵。请从低音量开始。
常见问题
什么是音调生成器?它有什么用途?
音调生成器是一种以特定频率和波形产生音频信号的工具。它通常用于测试扬声器和耳机、校准音频设备、调音乐器、进行听力范围测试、匹配耳鸣频率以及声波特性的教育演示。生成的音调范围从低频(20Hz)到高频(20,000Hz),覆盖人类听力的全部范围。
如何使用这个音调生成器?
1. 选择波形类型(纯音调选正弦波,丰富谐波选方波/锯齿波/三角波)。2. 使用滑块、数字输入或预设按钮设置所需频率(例如:标准A4调音440Hz)。3. 将音量调至舒适水平——为保护听力请从低音量开始。4. 点击播放按钮开始生成音调。5. 观察波形可视化以实时查看音频信号形状。6. 切换到频谱视图查看信号的频率内容(谐波)。7. 使用多音调标签页同时混合多个频率。
我的音频数据会发送到服务器吗?
不会。此工具100%在客户端运行,使用浏览器内置的Web Audio API。所有音频合成、处理和可视化完全在您的设备上进行。音频数据、频率设置或任何其他信息都不会传输到服务器。初始页面加载后,该工具可完全离线工作。
正弦波、方波、锯齿波和三角波有什么区别?
正弦波:只有单一频率的最纯净音调。声音平滑干净。用作标准参考信号。方波:仅包含奇数谐波,振幅递减。声音空洞嗡嗡作响。常见于复古游戏音乐。锯齿波:包含所有谐波,振幅递减。声音明亮刺耳。常用于合成器音色。三角波:像方波一样只包含奇数谐波,但衰减更快。声音柔和,类似笛声。
为什么我听不到很低或很高的频率?
典型的人类听力范围是20Hz到20,000Hz,但个体差异很大。低频(约40Hz以下)需要能够产生低音的扬声器或耳机,许多笔记本电脑的扬声器无法重现。高频听力随年龄自然下降——大多数25岁以上的成年人无法听到15-16kHz以上的声音。如果听不到某个频率,请谨慎提高音量,确保您的扬声器支持该范围,或使用耳机测试。
可以同时生成多个音调吗?
可以。切换到多音调标签页可创建和混合最多4个同时音调。每个音调都有独立的频率、波形和音量控制。这对于创建音程、和弦、双耳节拍或测试多个频率的交互作用(干涉模式、拍频)非常有用。可视化显示所有活跃音调的合成波形。
440Hz频率是什么?为什么它特殊?
440Hz是音乐会音高的国际标准,定义为中央C上方的A音(A4)。它于1955年被国际标准化组织(ISO 16)采用,在全球范围内作为乐器调音的参考频率使用。一些音乐家使用432Hz(有时称为威尔第音高)等替代参考,此工具中也提供了该预设。
代码示例
// Using the Web Audio API to generate tones in the browser
function playTone(frequency = 440, waveform = 'sine', volume = 0.5) {
const ctx = new AudioContext();
const oscillator = ctx.createOscillator();
const gainNode = ctx.createGain();
oscillator.type = waveform; // 'sine', 'square', 'sawtooth', 'triangle'
oscillator.frequency.setValueAtTime(frequency, ctx.currentTime);
gainNode.gain.setValueAtTime(volume, ctx.currentTime);
oscillator.connect(gainNode);
gainNode.connect(ctx.destination);
oscillator.start();
// Return stop function
return () => {
gainNode.gain.linearRampToValueAtTime(0, ctx.currentTime + 0.05);
setTimeout(() => {
oscillator.stop();
oscillator.disconnect();
ctx.close();
}, 50);
};
}
// Convert frequency to musical note name
function frequencyToNote(frequency) {
const A4 = 440;
const noteNames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'];
const semitones = 12 * Math.log2(frequency / A4);
const roundedSemitones = Math.round(semitones);
const cents = Math.round((semitones - roundedSemitones) * 100);
const noteIndex = ((roundedSemitones % 12) + 12 + 9) % 12;
const octave = Math.floor((roundedSemitones + 9) / 12) + 4;
return { note: noteNames[noteIndex] + octave, cents };
}
// Example usage
const stop = playTone(440, 'sine', 0.5);
console.log(frequencyToNote(440)); // { note: 'A4', cents: 0 }
console.log(frequencyToNote(261.63)); // { note: 'C4', cents: 0 }
setTimeout(stop, 2000);