WIN QT libsndfile库编译及使用

一、概述

libsndfile库是一个用 C 语言编写的开源库,用于读取和写入多种音频文件格式。

环境:QT5.9.9、cmakegui3.23.0、QT的编译器是minWG32

二、安装

1、下载libsndfile源码,连接:https://github.com/libsndfile/libsndfile

2、解压源码,运行cmakegui,选择源码路径和编译目标路径

3、点击Configure,再弹出的对话框选择目标编译器,MinGW Makefiles,点击finish,就会进行相关配置。(如果已经配置过,想要重新配置,需要清理下缓存,cmakegui界面:File->Delete Cache)

4、等配置完成,在界面找到安装路径选项CMAKE_INSTALL_PREFIX,选择编译后生成文件的安装路径,然后点击右下角的Generate,等待完成生成cmakefile相关文件。

5、Generate步骤执行结束后,运行QT minWG环境(在cmd命令窗口执行以下命令)

6、cmd命令窗口,切换路径到刚生成makefiles的文件夹下

7、输入编译命令,mingw32-make,等待编译完成后,再输入mingw32-make install

9、在刚指定的安装路径build_install就可以看到include 、lib、bin 等相关文件,至此编译完成

三、测试

1、创建QT测试项目,把生成的include文件sndfile.h、libsndfile.a拷贝到项目路径下,并在.pro文件添加现有文件和库文件如下

2、编写测试代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "fftw3.h"
#include "sndfile.h"
#include <QDebug>
#include <QVector>
#include <complex>
#include <iostream>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);wav_test();
}MainWindow::~MainWindow()
{delete ui;
}// 计算 FFT(双精度版本)
std::vector<std::complex<double>> MainWindow::compute_fft(const std::vector<double>& input_signal, int N) {// 分配 FFTW 输入和输出数组fftw_complex *in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);fftw_complex *out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);// 加窗(汉宁窗)std::vector<double> windowed_signal(N);for (int i = 0; i < N; ++i) {double window = 0.5 * (1 - cos(2 * M_PI * i / (N - 1)));  // 汉宁窗windowed_signal[i] = input_signal[i] * window;in[i][0] = windowed_signal[i];  // 实部in[i][1] = 0.0;                 // 虚部}// 创建 FFTW 计划fftw_plan plan = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);// 执行 FFTfftw_execute(plan);// 转换为 C++ complex 格式std::vector<std::complex<double>> fft_result(N);for (int i = 0; i < N; ++i) {fft_result[i] = std::complex<double>(out[i][0], out[i][1]);}// 清理资源fftw_destroy_plan(plan);fftw_free(in);fftw_free(out);return fft_result;
}// 计算信号能量
double MainWindow::compute_energy(const std::vector<double>& signal) {double energy = 0.0;for (double sample : signal) {energy += sample * sample;}return energy;
}// 判断音频是否正常
bool MainWindow::is_audio_normal(const std::vector<double>& audio_data, int sample_rate) {const int N = 1024;  // FFT 点数(必须是 2 的幂次)const int step = N / 2;  // 滑动步长(50% 重叠)// 1. 静音检测(总能量是否过低)double total_energy = compute_energy(audio_data);double silence_threshold = 1e-6 * sample_rate;  // 经验阈值if (total_energy < silence_threshold) {std::cout << "Silence detected(energy too low)​" << std::endl;//检测到静音(能量过低)​return false;}// 2. 分帧 FFT 分析(示例仅分析前 1 帧)std::vector<double> frame(audio_data.begin(), audio_data.begin() + N);if (frame.size() < N) {std::cerr << "Not enough audio data" << std::endl;//音频数据不足return false;}std::vector<std::complex<double>> fft_result = compute_fft(frame, N);// 3. 计算幅度谱std::vector<double> magnitude_spectrum(N / 2);for (int i = 0; i < N / 2; ++i) {magnitude_spectrum[i] = std::abs(fft_result[i]);}// 4. 频率分辨率double freq_resolution = sample_rate / N;// 5. 检测目标频段能量(如人声 300Hz~3400Hz)double voice_low = 300.0;double voice_high = 3400.0;int voice_low_idx = static_cast<int>(voice_low / freq_resolution);int voice_high_idx = static_cast<int>(voice_high / freq_resolution);double voice_band_energy = 0.0;for (int i = voice_low_idx; i <= voice_high_idx; ++i) {if (i < magnitude_spectrum.size()) {voice_band_energy += magnitude_spectrum[i];}}// 6. 高频噪声检测(如 > 8000Hz 的能量占比过高)int noise_low_idx = static_cast<int>(8000.0 / freq_resolution);double noise_band_energy = 0.0;for (int i = noise_low_idx; i < magnitude_spectrum.size(); ++i) {noise_band_energy += magnitude_spectrum[i];}double total_spectrum_energy = std::accumulate(magnitude_spectrum.begin(), magnitude_spectrum.end(), 0.0);double noise_ratio = noise_band_energy / total_spectrum_energy;// 7. 判断是否异常if (voice_band_energy < 0.1 * total_spectrum_energy) {std::cout << "Frequency deviation detected (low energy in the vocal range)​" << std::endl;//检测到频率偏移(人声频段能量不足)return false;}if (noise_ratio > 0.3) {std::cout << "High-frequency noise detected (high noise proportion)​" << std::endl;//检测到高频噪声(噪声占比过高)return false;}std::cout << "audio normal" << std::endl;return true;
}int MainWindow::wav_test() {// 1. 读取 WAV 文件(使用 libsndfile)SF_INFO sf_info;SNDFILE* file = sf_open("audio.wav", SFM_READ, &sf_info);if (!file) {std::cerr << "can not open wav file" << std::endl;return -1;}std::vector<double> audio_data(sf_info.frames * sf_info.channels);sf_read_double(file, audio_data.data(), audio_data.size());sf_close(file);// 如果是立体声,取单声道(或计算双声道均值)if (sf_info.channels == 2) {std::vector<double> mono_audio(audio_data.size() / 2);for (size_t i = 0; i < mono_audio.size(); ++i) {mono_audio[i] = (audio_data[2 * i] + audio_data[2 * i + 1]) / 2.0;}audio_data = mono_audio;}// 2. 判断音频是否正常bool is_normal = is_audio_normal(audio_data, sf_info.samplerate);std::cout << "normal: " << (is_normal ? "Yes" : "No") << std::endl;return 0;
}

5、编译运行

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

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

相关文章

Supergateway教程

Supergateway 是一款专为 MCP&#xff08;Model Context Protocol&#xff09;服务器设计的远程调试与集成工具&#xff0c;通过 SSE&#xff08;Server-Sent Events&#xff09;或 WebSocket&#xff08;WS&#xff09;协议实现基于 stdio 的服务器与客户端的高效通信。 Super…

203.移除链表元素 707.设计链表 206.反转链表

203.移除链表元素 Python链表节点定义&#xff1a; class ListNode:def __init__(self, val, nextNone):self.val valself.next next 性能分析 链表的特性和数组的特性进行一个对比&#xff0c;如图所示&#xff1a; 203. 移除链表元素 这道题就是给大家一个链表&#x…

人工智能之数学基础:利用全概率公式如何将复杂事件转为简单事件

本文重点 全概率公式是概率论中的核心工具,用于计算复杂事件的概率。其核心思想是将复杂事件分解为若干互斥且穷尽的简单事件,通过计算各简单事件的概率及其条件概率,最终求得目标事件的概率。 全概率公式 全概率公式就是将复杂事件简单化,定义如下: 如果随机事件A1,…

飞算JavaAI深度解析:从入门到对比

目录 一、飞算JavaAI是什么 二、如何注册和开始使用 三、使用体验&#xff1a;它能带来什么 四、与其他大模型的对比分析 五、总结与展望 随着人工智能技术的飞速发展&#xff0c;大模型在软件开发领域的应用越来越广泛。其中&#xff0c;代码生成工具作为提升开发效率的利…

Flutter各大主流状态管理框架技术选型分析及具体使用步骤

技术选型决策树 #mermaid-svg-m5gUL7Cpx4rYV2BQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-m5gUL7Cpx4rYV2BQ .error-icon{fill:#552222;}#mermaid-svg-m5gUL7Cpx4rYV2BQ .error-text{fill:#552222;stroke:#552…

Redis类型之String

1.Redis中的string注意本文以及之后讲的redis的类型但是指的value的类型&#xff0c;所有的key都是stringRedis中的字符串&#xff0c;直接就是按照二进制数据的方式存储的&#xff0c;不会做任何的编码转换&#xff0c;这里相对于mysql就比较好&#xff08;个人感觉&#xff0…

[激光原理与应用-156]:光学器件 - 激光器为什么会出现多余的能量,哪些地方会出现多余能量?

在激光器运行过程中&#xff0c;多余能量的出现是不可避免的物理现象&#xff0c;其根源在于能量转换与传输过程中的非理想特性。以下从能量来源、产生位置及具体机制三方面进行详细说明&#xff1a;一、多余能量的主要来源泵浦源效率限制泵浦源&#xff08;如激光二极管、闪光…

Arxiv-Daily

Daily Paper Report - 2025-07-24 12:53 Today’s Recommended Papers 1. Multi-modal Multi-task Pre-training for Improved Point Cloud Understanding Authors: Liwen Liu, Weidong Yang, Lipeng Ma, Ben Fei Deep-Dive Summary: 多模态多任务预训练以改善点云理解 预…

如何对云环境或者超融合系统进行性能测试?

最近几个月&#xff0c;公司开启了新的产品计划&#xff0c;准备来做一个国产超融合一体机&#xff08;其实个人觉得现在入行已经晚了太多了&#xff0c;市场基本没有多少了&#xff09; POC功能测试过完&#xff0c;但是感觉不到什么优势&#xff0c;由于芯片架构采用的是arm架…

【web自动化测试】实战

web自动化测试就是对界面的测试1、编写测试用例2、参考测试用例&#xff0c;创建自动化测试项目&#xff0c;编写自动化测试脚本论坛登录页&#xff1a;ForumLoginTest.py论坛首页&#xff1a;ForumListTest.py论坛详情页&#xff1a;ForumDetailTest.py论坛编辑页&#xff1a;…

在Maxscript中随机化对象变换、颜色和材质

只需几行Maxscript,即可为3ds Max场景带来更多活力和变化! 在本文中,您将学习如何快速随机化选定对象的位置、旋转、线颜色和材质。 非常适合在ArchViz、动态图形和产品可视化项目中创建更自然、更少机械的布局。 为什么要使用随机化脚本? 1.快速为场景添加自然随机性 2.…

分类数据集 - 交通事故场景分类数据集下载

数据集介绍&#xff1a;交通事故场景分类数据集&#xff0c;真实交通场景高质量图片数据&#xff1b;适用实际项目应用&#xff1a;公共场所监控场景下是否发生交通事故检测项目&#xff0c;以及作为监控场景通用交通检测数据集场景数据的补充&#xff1b;数据集类别&#xff1…

内网公网详解,及无公网IP内网穿透给外网直接远程连接访问的具体实现方法步骤

一、什么是内网、外网1、内网IP&#xff08;局域网IP&#xff09;是指在私有网络或局域网内部使用的IP地址&#xff0c;无法直接从互联网访问&#xff0c;需通过NAT&#xff08;网络地址转换&#xff09;技术实现对外通信。内网IP&#xff08;Intranet IP&#xff09;是专为局域…

Redis协议数据迁移方式

主从复制&#xff08;REPLICAOF/SLAVEOF&#xff09;&#xff1a;目标实例挂为从节点&#xff0c;通过复制协议全量增量同步后切换为主。模拟从节点工具&#xff1a;模拟复制协议同步数据&#xff0c;常见两种实现&#xff1a;(1) 拉取全量和增量命令流&#xff0c;在本地生成 …

英语中日期与时间缩写

日常使用中&#xff0c;时间缩写无处不在。掌握这些缩写不仅能提高沟通效率&#xff0c;还能让您的英语表达更加地道和专业。本文将系统性地介绍英语中各类时间相关缩写&#xff0c;包括月份、星期、时刻表达等&#xff0c;并提供实用记忆技巧和应用场景。 一、时间缩写基础概…

【Spring Cloud】-- RestTeplate实现远程调用

实现远程调用有很多种方式&#xff0c;这里我们使用RestTemplate来进行实现。 REST &#xff1a;表现层资源状态转移&#xff08;资源在网络中以某种表现形式进行状态转移&#xff09;&#xff0c;是一种软件架构风格&#xff0c;状态转移&#xff1a;数据状态的变化。 表现层&…

2025年信创政策解读:如何应对国产化替代挑战?(附禅道/飞书多维表格/华为云DevCloud实战指南)

本文核心产品&#xff1a;​​禅道&#xff08;国产项目管理工具&#xff09;、飞书多维表格&#xff08;协同办公工具&#xff09;、华为云DevCloud&#xff08;云端研发平台&#xff09;​​ ——在“自主可控”成为国家战略关键词的2025年&#xff0c;国产化替代已从“可选动…

如何让 RAG 检索更高效?——大模型召回策略全解

如何让 RAG 检索更高效&#xff1f;——大模型召回策略全解 一、引子&#xff1a;RAG 的“强”靠得住吗&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff09;作为一种将文档检索与大语言模型结合的框架&#xff0c;已成为企业落地知识问答、搜索增强、智能…

Bilateral Reference for High-Resolution Dichotomous Image Segmentation

代码来源 https://github.com/ZhengPeng7/BiRefNet 模块作用 DIS 是一种旨在对高分辨率图像中的目标物体进行精确分割的技术&#xff0c;尤其适用于具有复杂细微结构的物体&#xff0c;例如细长的边缘或微小细节。传统方法在处理这类任务时往往难以捕捉细微特征或恢复高分辨…

RAGFlow 0.20.0 : Multi-Agent Deep Research

Deep Research&#xff1a;Agent 时代的核心能力2025 年被称为 Agent 落地元年&#xff0c;在解锁的各类场景中&#xff0c;最有代表性之一&#xff0c;就是 Deep Research 或者以它为基座的各类应用。为什么这么讲&#xff1f; 因为通过 Agentic RAG 及其配套的反思机制&#…