【Audio】正弦波生成原理及C++代码

正弦波生成及频谱分析

正弦波公式

  • 诊断系统(Diag)会通过播放一段指定频率、采样率、时长及振幅的正弦音,以此对Audio测试。
  • 正弦波的公式如下,其中 A是振幅、x是时间、F是频率。
    y = A ∗ sin ⁡ ( 2 ∗ π ∗ x ∗ F ) y = A* \sin \lparen 2 * \pi * x * F \rparen y=Asin(2πxF)

当振幅是1.0 ,频率是1.0(频率指一秒钟震几次)。正弦波公式及其图像为
y = sin ⁡ ( 2 π x ) y = \sin \lparen 2 \pi x \rparen y=sin(2πx)
在这里插入图片描述

  • 考虑到相偏移和Y轴偏移量(比如为了方便计算振幅不存在负数,那么Y轴向上偏移),其公式为
    y = A ∗ sin ⁡ ( 2 ∗ π ∗ x ∗ F + θ ) + D y = A* \sin \lparen 2 * \pi * x * F + \theta \rparen + D y=Asin(2πxF+θ)+D

C++生成正弦波

  • WebRTC中提供了一段正弦波的生成函数,生成精度比较高。可以借鉴其代码,编写正弦波函数(改造后的实际应用代码不便放出)。这里分析一下WebRTC 正弦波生成源码。
// webrtc/modules/audio_mixer/sine_wave_generator.h
/**  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.**  Use of this source code is governed by a BSD-style license*  that can be found in the LICENSE file in the root of the source*  tree. An additional intellectual property rights grant can be found*  in the file PATENTS.  All contributing project authors may*  be found in the AUTHORS file in the root of the source tree.*/#ifndef MODULES_AUDIO_MIXER_SINE_WAVE_GENERATOR_H_
#define MODULES_AUDIO_MIXER_SINE_WAVE_GENERATOR_H_#include <stdint.h>#include "api/audio/audio_frame.h"
#include "rtc_base/checks.h"namespace webrtc {class SineWaveGenerator {public:SineWaveGenerator(float wave_frequency_hz, int16_t amplitude): wave_frequency_hz_(wave_frequency_hz), amplitude_(amplitude) {RTC_DCHECK_GT(wave_frequency_hz, 0);}// Produces appropriate output based on frame->num_channels_,// frame->sample_rate_hz_.// 通过这个函数生成正弦波void GenerateNextFrame(AudioFrame* frame);private:float phase_ = 0.f;// 正弦波频率const float wave_frequency_hz_;// 振幅const int16_t amplitude_;
};}  // namespace webrtc#endif  // MODULES_AUDIO_MIXER_SINE_WAVE_GENERATOR_H_// webrtc/modules/audio_mixer/sine_wave_generator.cc
/**  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.**  Use of this source code is governed by a BSD-style license*  that can be found in the LICENSE file in the root of the source*  tree. An additional intellectual property rights grant can be found*  in the file PATENTS.  All contributing project authors may*  be found in the AUTHORS file in the root of the source tree.*/#include "modules/audio_mixer/sine_wave_generator.h"#include <math.h>
#include <stddef.h>#include "rtc_base/numerics/safe_conversions.h"namespace webrtc {namespace {
constexpr float kPi = 3.14159265f;
}  // namespacevoid SineWaveGenerator::GenerateNextFrame(AudioFrame* frame) {RTC_DCHECK(frame);// 获取用来保存数据的指针地址(一段Buffer)int16_t* frame_data = frame->mutable_data();// samples_per_channel_ 表示每个声道采样多少个样本for (size_t i = 0; i < frame->samples_per_channel_; ++i) {// 计算每个声道(Channel)的样本值for (size_t ch = 0; ch < frame->num_channels_; ++ch) {// 比如双声道(两个Channel),i = 0时就是frame_data[0] 和frame_data[1]// frame_data[ 2 * 0 + 0 ] --> Frame_data[0]// frame_data[ 2 * 0 + 1 ] --> Frame_data[1]// amplitude_  指振幅,sinf(phase_) 是对 phase_ 其sin函数值frame_data[frame->num_channels_ * i + ch] =rtc::saturated_cast<int16_t>(amplitude_ * sinf(phase_));}// 这段是重点。 phase_ 就是正弦函数中的 变量值。// wave_frequency_hz_  表示采样频率// Kpi 为π// 2∗ Kpi * wave_frequency_hz_ 是一个完整点的采样周期。// frame->sample_rate_hz_ 这个参数表示采样率// 采样率理解为在一个采样周期内,采多少个点。// 所以每个点的步长,例如 [ 0 0.1 0.2 ... 1.0 ], 0.1就是步长。// 采样的步长应为  采样周期 / 采样率。phase_ += wave_frequency_hz_ * 2 * kPi / frame->sample_rate_hz_;}
}
}  // namespace webrtc
  • 上面的代码中,针对多通道、特定频率、特定采样率、特定时长(样本点),生成了一段正弦波数据。关于AudioFrame,实际上就是记录了一些设定项,以及保存数据的数组,其源码可以参考(webrtc/api/audio/audio_frame.h)
  • WebRTC中提供的Testsample
// The audio level ranges linearly [0,32767].
// audio_level 振幅
// duration_ms 时间
// sample_rate_hz 采样频率
// num_channels 通道数
std::unique_ptr<AudioFrame> CreateAudioFrame1kHzSineWave(int16_t audio_level,int duration_ms,int sample_rate_hz,size_t num_channels) {// 根据采样频率,计算样本数size_t samples_per_channel = sample_rate_hz / (1000 / duration_ms);// 创建对象,保存样本数据std::vector<int16_t> audio_data(samples_per_channel * num_channels, 0);// 给audioFrame设置相关参数std::unique_ptr<AudioFrame> audio_frame = std::make_unique<AudioFrame>();audio_frame->UpdateFrame(0 /* RTP timestamp */, &audio_data[0],samples_per_channel, sample_rate_hz,AudioFrame::SpeechType::kNormalSpeech,AudioFrame::VADActivity::kVadUnknown, num_channels);// 生成频率是1000(1kHZ)的正弦波SineWaveGenerator wave_generator(1000.0, audio_level);wave_generator.GenerateNextFrame(audio_frame.get());return audio_frame;
}
  • 需要注意一点,正弦波频率 和 采样频率不是一个事情。正弦波频率是指正弦波一秒钟震几下,在人耳辨别的范围内,频率越高越刺耳。采样频率指的是将连续信号转化为离散信号时,采样周期的选择,也就是一秒钟采几次(一般为44.1kHz)

频谱分析

  • 利用一些音频软件,可以对生成的数据进行分析。比如通上述代码,生成300HZ的一段正弦波数据。通过频谱分析可以看出,其峰值为311。其误差值较小。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/149432.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

properties文件和yaml文件的区别~

之前&#xff0c;关于数据库的连接信息&#xff0c;端口号的设置等&#xff0c;我们会将它分门别类的写在多个文件中&#xff0c;但SpringBoot&#xff0c;它讲究统一的配置管理&#xff0c;我们想设置的任何参数都集中在一个固定位置和命名的配置文件&#xff0c;而该配置文件…

Allure-pytest功能特性介绍

前言 学pytest就不得不说fixture&#xff0c;fixture是pytest的精髓所在&#xff0c;就像unittest中的setup和teardown一样&#xff0c;如果不学fixture那么使用pytest和使用unittest是没什么区别的(个人理解)。 fixture用途 1.做测试前后的初始化设置&#xff0c;如测试数据准…

计算机竞赛 题目:基于python的验证码识别 - 机器视觉 验证码识别

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于pyt…

国庆中秋宅家自省: Python在Excel中绘图尝鲜

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 【一】国庆中秋: 悟 【国…

Unity - 实践: Metallic流程贴图 转 Specular流程贴图

文章目录 目的Metallic Flow - SP - 输出输出的 MRA (MGA) 贴图 Metallic->Specular (根据教程一步一步实践)1. Base color Metallic -> Diffuse2. Base color Metallic -> Specular3. Roughness -> Glossiness输出贴图&#xff0c;在 unity 中展示&#xff1a;M…

【12】c++设计模式——>单例模式练习(任务队列)

属性&#xff1a; &#xff08;1&#xff09;存储任务的容器&#xff0c;这个容器可以选择使用STL中的队列&#xff08;queue) &#xff08;2&#xff09;互斥锁&#xff0c;多线程访问的时候用于保护任务队列中的数据 方法&#xff1a;主要是对任务队列中的任务进行操作 &…

蓝桥杯---第二讲---二分与前缀和

文章目录 前言Ⅰ. 数的范围0x00 算法思路0x00 代码书写 Ⅱ. 数的三次方根0x00 算法思路0x01代码书写 Ⅲ. 前缀和0x00 算法思路0x01 代码书写 Ⅳ. 子矩阵的和0x00 算法思路0x01 代码书写 Ⅴ. 机器人跳跃问题0x00 算法思路0x01 代码书写 Ⅵ. 四平方和0x00 算法思路0x01 代码书写 …

超声波气象站——环境监测领域强大助手

超声波气象站是环境监测领域的一位强大助手&#xff0c;超声波气象站是一种综合型的气象设备&#xff0c;精巧而全面&#xff0c;满足人们对环境状况的深入了解和精准把握。 首先&#xff0c;超声波气象站的传感器部分&#xff0c;是它的核心组成部分&#xff0c;这位“感知者”…

【Hello Linux】多路转接之 epoll

本篇博客介绍&#xff1a; 多路转接之epoll 多路转接之epoll 初识epollepoll相关系统调用epoll的工作原理epoll服务器编写成员变量构造函数 循环函数HandlerEvent函数epoll的优缺点 我们学习epoll分为四部分 快速理解部分概念 快速的看一下部分接口讲解epoll的工作原理手写epo…

GB28181学习(六)——实时视音频点播(数据传输部分)

GB28181系列文章&#xff1a; 总述&#xff1a;https://blog.csdn.net/www_dong/article/details/132515446 注册与注销&#xff1a;https://blog.csdn.net/www_dong/article/details/132654525 心跳保活&#xff1a;https://blog.csdn.net/www_dong/article/details/132796…

【SpringCloud】微服务技术栈入门3 - Gateway快速上手

目录 GatewayWebFlux网关基本配置过滤器与断言工厂全局过滤器跨域处理 CORS Gateway WebFlux gateway 基于 webflux 构建 WebFlux 是基于反应式流概念的响应式编程框架&#xff0c;用于构建异步非阻塞的 Web 应用程序。它支持响应式编程范式&#xff0c;并提供了一种响应式的方…

想要精通算法和SQL的成长之路 - 无重复字符的最长子串和滑动窗口最大值

想要精通算法和SQL的成长之路 - 无重复字符的最长子串 前言一. 无重复字符的最长子串二. 滑动窗口最大值2.1 滑动窗口的基本操作 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 无重复字符的最长子串 原题链接 思路如下&#xff1a; 用一个滑动窗口&#xff0c;该窗口区…

SpringBoot自带模板引擎Thymeleaf使用详解①

目录 前言 一、SpringBoot静态资源相关目录 二、变量输出 2.1 在templates目录下创建视图index.html 2.2 创建对应的Controller 2.3 在视图展示model中的值 三、操作字符串和时间 3.1 操作字符串 3.2 操作时间 前言 Thymeleaf是一款用于渲染XML/HTML5内容的模板引擎&am…

数据分析视角中的商业分析学习笔记

数据分析一大堆&#xff0c;结果却是大家早就知道的结论&#xff1f;是工具和方法出问题了吗&#xff1f;真正原因可能是你的思维有误区。 为什么分析的这么辛苦&#xff0c;得出的结论大家早知道&#xff0c;谁谁都不满意&#xff1f;核心原因有3个&#xff1a; 分析之前&am…

DataX和dataX-web 集群部署及使用

&#x1f4d1; DataX和dataX-web 集群部署及使用 一 . 安装前准备 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 DataX 采用 框架 插件 的模式…

SpringBoot vue云办公系统

SpringBoot vue云办公系统 系统功能 云办公系统 登录 员工资料管理: 搜索员工 添加编辑删除员工 导入导出excel 薪资管理: 工资账套管理 添加编辑删除工资账套 员工账套设置 系统管理: 基础信息设置 部门管理 职位管理 职称管理 权限组管理 操作员管理 开发环境和技术 开发语…

网络准入 重定向,DNS劫持内网设备访问网站

环境&#xff1a;Nginx 问题&#xff1a; 1.某网络实施网络准入控制&#xff0c;需要劫持不受信网段的客户端 所有访问到指定引导页面 2.需要劫持PS4 用户访问任意网站&#xff0c;或用户指南 方式全自动破解 解决办法&#xff1a;搭建dnsmasq DNS服务器&#xff0c;全域名解析…

Spring MVC程序开发(JavaEE进阶系列3)

目录 前言&#xff1a; 1.什么是Spring MVC 1.1MVC的定义 1.2MVC和Spring MVC的关系 1.3为什么要学习Spring MVC 2.Spring MVC项目的创建 3.Spring MVC框架的使用 3.1连接的功能 3.1.1RequestMapping 3.1.2GetMapping 3.1.3PostMapping 3.2获取参数的功能 3.2.1获…

Error string: Could not load library

启动Rivz时&#xff0c;报错&#xff1a; Error string: Could not load library (Poco exception libg2o_csparse_extension.so.0.1: cannot open shared object file: No such file or directory) [ERROR] [1696572310.529059051]: Failed to load nodelet [/radar_graph_s…

Dubbo 融合 Nacos 成为注册中心

Nacos 作为 Dubbo 生态系统中重要的注册中心实现&#xff0c;本文将会介绍如何进行 Dubbo 对接 Nacos 注册中心的工作。 预备工作 请确保后台已经启动 Nacos 服务 快速上手 Dubbo 融合 Nacos 成为注册中心的操作步骤非常简单&#xff0c;大致步骤可分为“增加 Maven 依赖”…