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
英文地址,請注明出處:http://en.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 及其配套的反思機制&#…