C# 声音强度图绘制

C# 声音强度图绘制

在这里插入图片描述

采集PCM音频数据

音频原来自麦克风

音频源来自录音文件

处理PCM音频数据

将PCM数据进行强度值换算

        private void UpdateVoice(double[] audio)
        {
            // 计算RMS值
            double rms = Math.Sqrt(audio.Select(x => x * x).Average());

            // 将RMS值转换为分贝值(以dBFS为单位)
            double dbfs = 20 * Math.Log10(rms);

            // 绘制数据
            volumeView.SetVolumeData(dbfs);
            volumeView.Refresh();
        }

绘制时频图

采用自定义控件的方式来绘制时频图,核心代码如下:

/// <summary>
/// 声音强度图
/// </summary>
public class SoundTimeVolumeControl : Control
{

    // 创建一个画笔
    private Pen pen = new Pen(Brushes.Blue, 1);
    public Brush TextBrush = new SolidColorBrush(Colors.Gainsboro);

    public void Refresh()
    {
        this.InvalidateVisual();
    }

    /// <summary>
    /// 最大值
    /// </summary>
    private double mMaxVolume;

    /// <summary>
    /// 最小值
    /// </summary>
    private double mMinVolume;


    // 数据源,用于存储折线图的数据
    double[] dbList = new double[256];

    public void SetVolumeData(double volume)
    {

        mMaxVolume = double.MinValue;
        mMinVolume = double.MaxValue;

        for (int i = dbList.Length - 1; i > 0; i--)
        {
            dbList[i] = dbList[i - 1];

            mMaxVolume = Math.Max(dbList[i], mMaxVolume);
            mMinVolume = Math.Min(dbList[i], mMinVolume);
        }

        dbList[0] = volume;

        mMaxVolume = Math.Max(volume, mMaxVolume);
        mMinVolume = Math.Min(volume, mMinVolume);
    }


    protected override void OnRender(DrawingContext drawingContext)
    {

        double width = this.ActualWidth;
        double height = this.ActualHeight;

        var itemWidth = width / 4;
        var itemHeight = height / 3;


        drawingContext.DrawRectangle(this.Background, null, new Rect(0, 0, width, height));
        // 画方框
        drawingContext.DrawRect(this.Foreground, 1, 1, width - 1, height - 1);

         画竖线
        //for (int i = 1; i < 4; i++)
        //{
        //    var left = i * itemWidth;
        //    drawingContext.DrawLine(this.Foreground, left, 0, left, height);
        //}

        // 画横线
        for (int i = 1; i < 3; i++)
        {
            var top = i * itemHeight;
            drawingContext.DrawLine(this.Foreground, 0, top, 3, top);

            drawingContext.DrawText(string.Format("-{0}dBFS", i * 30), this.TextBrush, 3 + 20, top, 13);
        }

        // 画折线
        if (mMaxVolume > mMinVolume)
        {
            DrawPointPath(drawingContext, width, height);
        }
    }


    private void DrawPointPath(DrawingContext drawingContext, double width, double height)
    {

        var itemHeight = height / 20;
        var itemWidth = width / dbList.Length;

        var amplitude = Math.Max(mMaxVolume - mMinVolume, 60);

        // 开始绘制路径
        StreamGeometry geometry = new StreamGeometry();
        using (StreamGeometryContext context = geometry.Open())
        {
            // 将路径移动到第一个数据点
            var x = (1 - (dbList[0] - mMinVolume) / amplitude) * 18;
            context.BeginFigure(new Point(0, x * itemHeight), false, false);

            // 添加线段连接每个数据点
            for (int i = 1; i < dbList.Length; i++)
            {
                if (dbList[i] < 0)
                {
                    x = (1 - (dbList[i] - mMinVolume) / amplitude) * 18;
                    context.LineTo(new Point(i * itemWidth, x * itemHeight), true, false);
                }
            }
        }

        // 绘制路径
        drawingContext.DrawGeometry(null, pen, geometry);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常用的接口测试工具

大家好&#xff0c;当谈到软件开发中的质量保证时&#xff0c;接口测试无疑是至关重要的一环。在当今快节奏的开发环境中&#xff0c;确保应用程序的各个组件之间的交互正常运作是至关重要的。而接口测试工具则成为了开发人员和测试人员的得力助手&#xff0c;帮助他们有效地测…

Java版电商平台B2B2C:多商家直播商城系统特性解析

B2B2C平台&#xff0c;立足于传统电商领域&#xff0c;同时引入了创新的商业模式。该平台不仅支持商家入驻和平台自营&#xff0c;还积极构建了一个全新的市场环境&#xff0c;旨在为各行各业及互联网创业者提供更多收益机会。 该平台以消费者需求为中心&#xff0c;帮助企业构…

什么是人机协同翻译

什么是人机协同翻译 序什么是人机协同翻译账号绑定服务开通文档翻译图片翻译体验感受及建议 序 什么是人机协同翻译&#xff0c;为什么会需要人机协同翻译&#xff0c;以及人机协同翻译的效果&#xff0c;应用场景等&#xff0c;本文将关于这些内容一一解答。 什么是人机协同…

全平台自定义小程序源码系统 一个后台控制7端 自主设计属于你的小程序 前后端带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;小程序以其轻量级、跨平台、即用即走的特点&#xff0c;成为企业、个人及开发者们追捧的热门工具。为了满足不同用户的需求&#xff0c;小编给大家分享一款全平台自定义小程序源码系统。该系统通过一套强大的后台管理系统&#xff0c;实…

SD NAND的垃圾回收机制:无人机数据管理的隐形守护者

随着科技的飞速发展&#xff0c;无人机在各个领域的应用越来越广泛&#xff0c;从航拍到物流配送&#xff0c;再到农业监测&#xff0c;无人机正逐渐成为我们生活中不可或缺的一部分。而SD NAND作为一种创新的存储芯片&#xff0c;可以直接贴片使用&#xff0c;具有小尺寸、高可…

机台数据导出难住IT管理员,如何才能解决IT人员的困境?

为了方便数据的共享、保存、分析、合规性和迁移等目的&#xff0c;企业会按规律性的时间周期进行机台数据的导出操作&#xff0c;通过专业的数据迁移软件、外部存储设备&#xff08;如USB硬盘、移动硬盘、SD卡等&#xff09;&#xff0c;或者通过机台设备的专用导出功能来完成。…

MoE 混合专家模型(Mixture of Experts)

参考&#xff1a;深度揭秘爆火MoE&#xff01;GPT-4关键架构&#xff0c;成开源模型逆袭杀手锏 (baidu.com) MoE是一种神经网络架构设计&#xff0c;在Transformer模块中集成了专家/模型层。 当数据流经MoE层时&#xff0c;每个输入token都会动态路由到专家子模型进行处理。当…

使用Rufus工具制作Ubuntu To Go——很详细

一、准备工作 准备工具&#xff1a; 1、下载Rufus(主角)软件 2、准备一个U盘或硬盘&#xff08;小白128G足够&#xff0c;装Ubuntu系统&#xff09; 3、下载Ubuntu系统镜像文件 1、下载软件Rufus 先来看一下官网介绍&#xff1a; Rufus 是一款格式化和创建 USB 启动盘的辅助工…

直播商城源码-PC+APP+H5+小程序现成源码

随着电商行业的不断演进&#xff0c;直播商城已成为连接消费者和商品的新兴桥梁。直播商城源码提供了一个完整的解决方案&#xff0c;使得企业能够迅速搭建起一个覆盖PC、APP、H5和小程序的全渠道电商平台。本文将探讨直播商城源码的优势、关键功能以及如何选择适合的现成源码。…

银河麒麟操作系统 v10 离线安装 mysql 8.4.0

一 查看系统环境 [root0003 ~]# cat /etc/os os-release ostree/ [root0003 ~]# cat /etc/os-release NAME"Kylin Linux Advanced Server" VERSION"V10 (Lance)" ID"kylin" VERSION_ID"V10" PRETTY_NAME"Kylin Linux Ad…

嵌入式Linux系统编程 — 1.5 文件描述符详解

目录 1 文件描述符简介 1.1 文件描述符特点 1.2 标准文件描述符 1.3 文件描述符的生命周期 2 fcntl()函数 2.1 fcntl()函数简介 2.2 复制文件描述符(F_DUPFD) 2.3 获取/设置文件状态标志(F_GETFL/F_SETFL ) 1 文件描述符简介 文件描述符&#xff08;File Descriptor&a…

绘画新手必备!六款免费易用的绘图软件推荐

在当今的数字世界里有各种各样的设计创作工具&#xff0c;那么问题来了我们应该如何在众多免费绘图软件中选择呢&#xff1f;为了回答这个问题&#xff0c;我们将在本文中介绍和测评六个领先的绘图软件。每一个都有自己独特的特点和优势&#xff0c;适合不同的需求和用户。以下…

Django缓存

由于Django是动态网站&#xff0c;所有每次请求均会去数据进行相应的操作&#xff0c;当程序访问量大时&#xff0c;耗时必然会更加明显&#xff0c;最简单解决方式是使用&#xff1a;缓存&#xff0c;缓存将一个某个views的返回值保存至内存或者memcache中&#xff0c;若某个时…

C++设计模式-策略模式,AI角色动态选择行为

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 27. 策略模式 策略模式让算法的选择与使用独立开来&#xff0c;使得代码更灵活、可扩展和易维护。应用&#xff1a;如在游戏开发中&#xff0c;AI角色需要根据环境和条件做出不同的行为&#xff0c;如寻路、攻击、躲避等。可…

【优选算法】栈 {何时使用栈结构?后缀表达式求值;中缀转后缀表达式;中缀表达式求值}

一、经验总结 何时使用栈结构解题&#xff1f; 做过相似的使用栈结构解得的题目嵌套处理&#xff1a;在从前向后处理的过程中&#xff0c;由于之后内容的不确定性而导致当前操作不能贸然进行&#xff0c;需要先进行保存&#xff0c;直到遇到区间结束标志&#xff08;如’)&am…

2024年船舶、机械制造与海洋科学国际会议(ICSEMMS2024)

2024年船舶、机械制造与海洋科学国际会议&#xff08;ICSEMMS2024&#xff09; 会议简介 我们诚挚邀请您参加将在重庆隆重举行的2024年国际造船、机械制造和海洋科学大会&#xff08;ICSEMMS024&#xff09;。作为一项跨学科和跨学科的活动&#xff0c;本次会议旨在促进造船…

PostgreSQL专家(pcp51)--王丁丁

#PostgreSQL培训 #postgresql认证 #postgreSQL考试 #PG考试 #PG培训

【Python系列】Python装饰器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【实战JVM】-实战篇-06-GC调优

文章目录 1 GC调优概述1.1 调优指标1.1.1 吞吐量1.1.2 延迟1.1.3 内存使用量 2 GC调优方法2.1 发现问题2.1.1 jstat工具2.1.2 visualvm插件2.1.3 PrometheusGrafana2.1.4 GC Viewer2.1.5 GCeasy 2.2 常见GC模式2.2.1 正常情况2.2.2 缓存对象过多2.2.3 内存泄漏2.2.4 持续FullGC…

【全开源】小区入户安检系统(FastAdmin + Uni-APP)

守护家的每一道防线 一款基于FastAdmin Uni-APP开发的小区入户安检系统(前端可发布为小程序、H5、App)。可针对不同行业自定义安检项目&#xff0c;线下安检&#xff0c;线上留存&#xff08;安检拍照/录像&#xff09;&#xff0c;提高安检人员安检效率。 一、引言&#xff…