声波通信(SinVoice)代码解读(一) 如何产生给定频率的声音

开头的话

最近打算用c++重写开源项目SinVoice,但是对于一些细节还是把握得不大好,因此我正在好好学习相关的内容,这里把学习过程中的一些心得体会分享出来,希望对关注声波通信的朋友们带来帮助。

点击进入SinVoice项目主页

本科在校学生,如果过程中有错误希望大家能绅士的指出,谢谢

如何产生给定频率的声音

这一篇我主要想说明在sinvoice里面声音是如何产生的,暂时没有关注整个系统的工作流程。

首先我们要了解一些背景知识
采样率:不多讲,对于本次内容来说,简单说来就是一秒钟系统发出多少次声音
我们需要明白声音的其实就是正弦波,我们用软件生成给定频率的声音,实际上就是生成一个给定频率的正弦波,既然是正弦波,那么肯定要让它先变高,再变低,给定的一系列数值在坐标轴上画出来的话肯定是跟正弦波的样子类似的。

熟悉这个项目的朋友肯定知道,要知道如何产生给定频率的声音,我们应该关注的类是 SinGenerator 这个类,而在这个类中的,我们应该关注的方法则是 public void gen(int genRate, int duration)这个方法。下面给出代码。

注意:为了更好的着眼于局部而非整个系统的流程,我删除并且修改了一些与本文无关的代码,这些代码是跟整个系统流程相关的,对于声音如何产生则无关紧要。

public static void gen()
    {
        int mGenRate = 1500;//声音的频率,单位Hz
        int mDuration = 50;//这个频率的声音持续时间,单位ms
        int n=
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
在uniapp H5中获取声音频率并绘制声波图可以通过以下步骤实现: 1. 使用HTML5的Web Audio API获取麦克风输入的音频数据。 2. 将音频数据转换成频率数据,可以使用FFT算法进行频谱分析。 3. 将频率数据绘制成声波图,可以使用Canvas进行绘制。 以下是一个简单的示例代码: ```html <template> <canvas id="canvas"></canvas> </template> <script> export default { mounted() { this.draw(); }, methods: { draw() { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); // 获取麦克风输入的音频数据 navigator.mediaDevices.getUserMedia({ audio: true }) .then(stream => { const audioContext = new AudioContext(); const source = audioContext.createMediaStreamSource(stream); const analyser = audioContext.createAnalyser(); // 配置AnalyserNode,将音频数据转换成频率数据 analyser.fftSize = 2048; const bufferLength = analyser.frequencyBinCount; const dataArray = new Uint8Array(bufferLength); source.connect(analyser); // 每隔16.7毫秒获取一次频率数据,并绘制成声波图 setInterval(() => { analyser.getByteFrequencyData(dataArray); ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.beginPath(); const barWidth = canvas.width / bufferLength; let x = 0; for (let i = 0; i < bufferLength; i++) { const barHeight = dataArray[i] / 2; ctx.fillStyle = `rgb(${barHeight}, 0, 0)`; ctx.fillRect(x, canvas.height - barHeight, barWidth, barHeight); x += barWidth + 1; } }, 16.7); }) .catch(err => { console.error(err); }); } } } </script> ``` 在上面的示例代码中,我们使用了HTML5的Web Audio API获取麦克风输入的音频数据,然后将音频数据转换成频率数据,并使用Canvas将频率数据绘制成声波图。你可以将上面的代码复制到你的uniapp项目中,并根据需要进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值