wordpress e/seo sem论坛

wordpress e,seo sem论坛,江门整站优化,安阳区号为什么是0372一、概述 系统分为录音模块、数据处理模块、播音模块。录音模块和播音模块使用alsa库进行读写数据。各模块为独立进程处理,模块之间使用命名管道进行数据的传输。数据处理模块我们使用基于频域的自适应滤波去啸叫算法。 二、工程实现 2.1 系统流程图 2.2 录音模块…

一、概述

        系统分为录音模块、数据处理模块、播音模块。录音模块和播音模块使用alsa库进行读写数据。各模块为独立进程处理,模块之间使用命名管道进行数据的传输。数据处理模块我们使用基于频域的自适应滤波去啸叫算法。

二、工程实现

2.1 系统流程图

2.2 录音模块(从ALSA 读数据)

#define ALSA_PCM_NEW_HW_PARAMS_API#include <alsa/asoundlib.h>
#include <stdio.h>
#define OUTPUT_PATH_NAME "/tmp/node2_to_node1.tmp"
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>int main(int argc, char *argv[]) {long loops;int rc;int size;unsigned int val;int dir;char *buffer;snd_pcm_t *handle;snd_pcm_hw_params_t *params;snd_pcm_uframes_t frames;/*以录制模式打开*//* Open PCM device for recording (capture). */rc = snd_pcm_open( &handle, "default", SND_PCM_STREAM_CAPTURE, 0);if (rc < 0) {fprintf(stderr, "unable to open pcm device");exit(EXIT_FAILURE);}/*分配一个参数对象*//* Allocate a hardware parameters object. */snd_pcm_hw_params_alloca(&params);/*初始化参数对象*//* Fill it in with default values. */rc = snd_pcm_hw_params_any(handle, params);if (rc < 0) {printf("Err\n");}/* Set the desired hardware parameters. *//*交错模式*//* Interleaved mode */rc = snd_pcm_hw_params_set_access(handle, params,SND_PCM_ACCESS_RW_INTERLEAVED);if (rc < 0) {printf("Err\n");}/*PCM格式*//* Signed 16-bit little-endian format */rc = snd_pcm_hw_params_set_format(handle, params,SND_PCM_FORMAT_S16_LE);if (rc < 0) {printf("Err\n");}/*设置通道数*//* Two channels (stereo) */rc = snd_pcm_hw_params_set_channels(handle, params, 1);if (rc < 0) {printf("Err\n");}/*设置采样率*//* 44100 bits/second sampling rate (CD quality) */val = 16000;rc = snd_pcm_hw_params_set_rate_near(handle, params,&val, &dir);if (rc < 0) {printf("Err\n");}/*没周期的帧数*//* Set period size to 32 frames. */frames = 128;rc = snd_pcm_hw_params_set_period_size_near(handle,params, &frames, &dir);if (rc < 0) {printf("Err\n");}/* Write the parameters to the driver */rc = snd_pcm_hw_params(handle, params);if (rc < 0) {fprintf(stderr,"unable to set hw parameters: %s/n",snd_strerror(rc));exit(1);}/* Use a buffer large enough to hold one period */rc = snd_pcm_hw_params_get_period_size(params,&frames, &dir);if (rc < 0) {printf("Err\n");}size = frames * 2 * 1; /* 2 bytes/sample, 2 channels */buffer = (char *) malloc(size);/* We want to loop for 5 seconds */rc = snd_pcm_hw_params_get_period_time(params, &val, &dir);loops = 5000000 / val;//printf("====================:%d\n", frames);//printf("====================\n");printf("++++ start record!\n");FILE *fp = fopen("bak_record1.pcm", "wb");//mkfifo(OUTPUT_PATH_NAME, 0666);int fout = open(OUTPUT_PATH_NAME, O_WRONLY);while (loops > 0) {//loops--;rc = snd_pcm_readi(handle, buffer, frames);if (rc == -EPIPE) {/* EPIPE means overrun */fprintf(stderr, "overrun occurred/n");//把PCM流置于PREPARED状态,这样下次我们向该PCM流中数据时,它就能重新开始处理数据。snd_pcm_prepare(handle);} else if (rc < 0) {fprintf(stderr,"error from read: %s/n",snd_strerror(rc));} else if (rc != (int)frames) {fprintf(stderr, "short read, read %d frames/n", rc);}short *buf = (short*)buffer;for (int i = 0; i < frames; i++) {buf[i] *= atoi(argv[1]);}rc = fwrite(buffer, 1, size, fp);if (rc != size) {fprintf(stderr,"short write: wrote %d bytes/n", rc);break;}if (write(fout, buffer, size) <= 0) {break;}}//调用snd_pcm_drain把所有挂起没有传输完的声音样本传输完全rc = snd_pcm_drain(handle);//关闭该音频流,释放之前动态分配的缓冲区,退出rc = snd_pcm_close(handle);free(buffer);fclose(fp);close(fout);return 0;
}

2.3 播音模块(数据写入ALSA)

#define ALSA_PCM_NEW_HW_PARAMS_API#include <alsa/asoundlib.h>
#include <stdio.h>
#define OUTPUT_PATH_NAME "/tmp/node1_to_node2.tmp"
#include <sys/types.h>
#include <sys/stat.h>int main(int argc, char *argv[]) {long loops;int rc;int size;snd_pcm_t *handle;snd_pcm_hw_params_t *params;unsigned int val;int dir;snd_pcm_uframes_t frames;char *buffer;/* Open PCM device for playback. */rc = snd_pcm_open(&handle, "default",SND_PCM_STREAM_PLAYBACK, 0);if (rc < 0) {fprintf(stderr,"unable to open pcm device: %s/n",snd_strerror(rc));exit(1);}/*分配一个参数对象*//* Allocate a hardware parameters object. */snd_pcm_hw_params_alloca(&params);/*初始化参数对象*//* Fill it in with default values. */snd_pcm_hw_params_any(handle, params);/* Set the desired hardware parameters. *//*交错模式*//* Interleaved mode */snd_pcm_hw_params_set_access(handle, params,SND_PCM_ACCESS_RW_INTERLEAVED);/*设置PCM格式*//* Signed 16-bit little-endian format */snd_pcm_hw_params_set_format(handle, params,SND_PCM_FORMAT_S16_LE);/*设置通道数*//* Two channels (stereo) */snd_pcm_hw_params_set_channels(handle, params, 1);/*设置采样率*//* 44100 bits/second sampling rate (CD quality) */val = 16000;snd_pcm_hw_params_set_rate_near(handle, params,&val, &dir);/* Set period size to 32 frames. */frames = 128;snd_pcm_hw_params_set_period_size_near(handle,params, &frames, &dir);/* Write the parameters to the driver */rc = snd_pcm_hw_params(handle, params);if (rc < 0) {fprintf(stderr,"unable to set hw parameters: %s/n",snd_strerror(rc));exit(1);}/* Use a buffer large enough to hold one period */snd_pcm_hw_params_get_period_size(params, &frames, &dir);size = frames * 2 * 1; /* 2 bytes/sample, 2 channels */printf("size value:%d, frames value:%d\n", size, frames);buffer = (char *) malloc(size);/* We want to loop for 5 seconds */snd_pcm_hw_params_get_period_time(params,&val, &dir);/* 5 seconds in microseconds divided by* period time */loops = 5000000 / val;snd_pcm_prepare(handle);printf("====start\n");mkfifo(OUTPUT_PATH_NAME, 0666);	//FILE *fp = fopen(argv[1], "rb");FILE *fp = fopen("bak_play1.pcm", "wb");int fd = open(OUTPUT_PATH_NAME, O_RDONLY);while (loops > 0) {//loops--;//rc = read(0, buffer, size);//rc = fread(buffer, 1, size, fp);rc = read(fd, buffer, size);if (rc <= 0) {fprintf(stderr, "end of file on input/n");break;} else if (rc != size) {fprintf(stderr,"short read: read %d != %d bytes/n", rc, size);}rc = fwrite(buffer, 1, size, fp);if (rc <= 0) {break;}rc = snd_pcm_writei(handle, buffer, frames);if (rc == -EPIPE) {/* EPIPE means underrun */fprintf(stderr, "underrun occurred/n");//把PCM流置于PREPARED状态,这样下次我们向该PCM流中数据时,它就能重新开始处理数据。snd_pcm_prepare(handle); } else if (rc < 0) {fprintf(stderr,"error from writei: %s/n",snd_strerror(rc));}  else if (rc != (int)frames) {fprintf(stderr,"short write, write %d frames/n", rc);}}//调用snd_pcm_drain把所有挂起没有传输完的声音样本传输完全snd_pcm_drain(handle);//关闭该音频流,释放之前动态分配的缓冲区,退出snd_pcm_close(handle);free(buffer);fclose(fp);close(fd);unlink(OUTPUT_PATH_NAME);return 0;
}

2.4 数据处理模块

(1)时域实现(加O3)

#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>#define OUTPUT_PATH_NAME "/tmp/node1_to_node2.tmp"
#define INPUT_PATH_NAME "/tmp/node2_to_node1.tmp"int main() {if (access(INPUT_PATH_NAME, F_OK) != -1) {printf("File exists.\n");} else {mkfifo(INPUT_PATH_NAME, 0666);}int fin = open(INPUT_PATH_NAME, O_RDONLY);int fout = open(OUTPUT_PATH_NAME, O_WRONLY);int frames = 128;int size = frames * 2;char *buffer = (char *) malloc(size);int chunk_num = 5;float mu = 0.01;float *u = (float*) malloc(sizeof(float) * frames * chunk_num);float *w = (float*) malloc(sizeof(float) * frames * chunk_num);for (int i = 0; i < frames * chunk_num; i++) {u[i] = 0;w[i] = 0;}float *current_out_data = (float*) malloc(sizeof(float) * frames);float *current_data = (float*) malloc(sizeof(float) * frames);float *last_data = (float*) malloc(sizeof(float) * frames);short *out_data = (short*) malloc(sizeof(short) * frames);for (int i = 0; i < frames; i++) {current_out_data[i] = 0;current_data[i] = 0;last_data[i] = 0;out_data[i] = 0;}while (1) {int rc = read(fin, buffer, size);if (rc <= 0) {fprintf(stderr, "end of file on input/n");break;} else if (rc != size) {fprintf(stderr,"short read: read %d bytes/n", rc);} else {printf("read len: %d\n", rc);}short *input_data = (short*)buffer;//printf("current_data:");for (int i = 0; i < frames; i++) {current_data[i] = (float)(input_data[i]) / 32768.0;//printf(" %f", current_data[i]);}//printf("\n");//printf("current_out_data:");for (int i = 0; i < frames; i++) {memmove(u+1, u, sizeof(float)*(frames*chunk_num-1));u[0] = last_data[i];float uw = 0;float uu = 1e-6;for (int k = 0; k < frames*chunk_num; k++) {uw += u[k]*w[k];uu += u[k]*u[k];}current_out_data[i] = current_data[i] - uw;//printf(" (%f %f %f)", current_out_data[i], uw, uu);for (int k = 0; k < frames*chunk_num; k++) {w[k] = w[k] + mu * current_out_data[i] * u[k] / uu;}}//printf("\n");//printf("out_data:");for (int i = 0; i < frames; i++) {if (current_out_data[i] > 1.0) {current_out_data[i] = 1.0;} else if (current_out_data[i] < -1.0) {current_out_data[i] = -1.0;}out_data[i] = (short)((current_out_data[i]) * 32767.0);//printf(" %d", out_data[i]);}//printf("\n");for (int i = 0; i < frames; i++) {last_data[i] = current_data[i];}rc = write(fout, (char*)out_data, size);if (rc <= 0) {break;} else {printf("write len: %d\n", rc);}}close(fin);close(fout);free(buffer);free(u);free(w);free(current_out_data);free(current_data);free(last_data);free(out_data);unlink(INPUT_PATH_NAME);return 0;
}

(2)频域实现(使用经典的频域分块自适应滤波aec算法)

#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include "afs-api.h"#define NUM_FRAMES 128#define OUTPUT_PATH_NAME "/tmp/node1_to_node2.tmp"
#define INPUT_PATH_NAME "/tmp/node2_to_node1.tmp"int main() {if (access(INPUT_PATH_NAME, F_OK) != -1) {printf("File exists.\n");} else {mkfifo(INPUT_PATH_NAME, 0666);}int fin = open(INPUT_PATH_NAME, O_RDONLY);int fout = open(OUTPUT_PATH_NAME, O_WRONLY);int frames = NUM_FRAMES;int size = frames * 2;char *buffer = (char *) malloc(size);float *in_data_f = (float*) malloc(sizeof(float) * frames);float *out_data_f = (float*) malloc(sizeof(float) * frames);float *ref_data_f = (float*) malloc(sizeof(float) * frames);short *out_data_s = (short*) malloc(sizeof(short) * frames);for (int i = 0; i < frames; i++) {in_data_f[i] = 0;out_data_f[i] = 0;ref_data_f[i] = 0;out_data_s[i] = 0;}void *handle = api_create_afs_handle(NUM_FRAMES, 16000);api_start_afs(handle);while (1) {int rc = read(fin, buffer, size);if (rc <= 0) {fprintf(stderr, "end of file on input/n");break;} else if (rc != size) {fprintf(stderr,"short read: read %d bytes/n", rc);} else {printf("read len: %d\n", rc);}short *input_data = (short*)buffer;for (int i = 0; i < frames; i++) {in_data_f[i] = (float)(input_data[i]);}api_process_afs(handle, in_data_f, ref_data_f, out_data_f, NUM_FRAMES);for (int i = 0; i < frames; i++) {         out_data_s[i] = (short)((out_data_f[i])*1);if (out_data_s[i] > 32000) {out_data_s[i] = 32000;} else if (out_data_s[i] < -32000) {out_data_s[i] = -32000;}}for (int i = 0; i < frames; i++) {ref_data_f[i] = out_data_f[i];}rc = write(fout, (char*)out_data_s, size);if (rc <= 0) {break;} else {printf("write len: %d\n", rc);}}close(fin);close(fout);free(buffer);api_end_afs(handle);api_destroy_afs_handle(handle);free(in_data_f);free(out_data_f);free(ref_data_f);free(out_data_s);unlink(INPUT_PATH_NAME);return 0;
}

2.5 效果

三、总结

        本节搭建了一个完整的扩声系统,解决了啸叫问题,如大家还有什么疑问,可以留言或私信讨论,由于篇幅限制,完整代码可以进入https://t.zsxq.com/qgmoN 获取。

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

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

相关文章

HTML——什么是块级元素,什么是内联元素,有何区别

在 HTML 中&#xff0c;块级元素&#xff08;Block-level element&#xff09;和内联元素&#xff08;Inline element&#xff09;是两种不同类型元素&#xff0c;它们在页面布局和样式应用方面有不同的行为和特性。 块级元素&#xff08;Block-level element&#xff09; 块级…

01 设计模式和设计原则

类设计原则&#xff1a; 单一职责原则&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09;&#xff1a;实现类要职责单一开闭原则&#xff08;Open Close Principle&#xff0c;OCP&#xff09;&#xff1a;对扩展开放&#xff0c;对修改关闭里氏替换原则…

【踩坑日记】springboot 打包后实现类无法找到

试过了所有改什么目录 依赖 clean都以失败告终 最后将实现类的文件名从Impl改成impl宣布成功 记得使用idea自带的重构

项目-苍穹外卖(十五) WebSocket+语音播报功能实现(来订单+催单)

一、介绍 二、入门案例 配置类&#xff1a; package com.sky.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter;/…

Redis、Memcached应用场景对比

环境 Redis官方网站&#xff1a; Redis - The Real-time Data Platform Redis社区版本下载地址&#xff1a;Install Redis | Docs Memcached官方网站&#xff1a;memcached - a distributed memory object caching system Memcached下载地址&#xff1a;memcached - a dis…

kettle插件-mysql8数据库插件

场景&#xff1a;群里有小伙伴反馈kettle 7.x版本不能自动连接mysql8&#xff0c;安排&#xff01;&#xff01;&#xff01; 1、将mysql8的驱动包mysql-connector-java-8.0.20.jar丢到kettle的lib目录下&#xff0c;重启spoon。 2、配置数据库连接&#xff0c;提示驱动类不对…

【软件测试】:软件测试实战

1. ⾃动化实施步骤 1.1 编写web测试⽤例 1.2 ⾃动化测试脚本开发 common public class AutotestUtils {public static EdgeDriver driver;// 创建驱动对象public static EdgeDriver createDriver(){// 驱动对象已经创建好了 / 没有创建if( driver null){driver new EdgeDr…

深度学习入门1 基于Python的理论与实现

torch.unsqueeze()将一维数据变为二维数据&#xff0c;torch只能处理二维数据 tensor不能反向&#xff0c;variable可以反向。variable.data.numpy()转换为numpy 第3章 神经网络 实现softmax函数时的注意事项&#xff1a;为防止e的指数运算造成溢出 矩阵的第 0 维是列方向,第…

多版本PHP开发环境配置教程:WAMPServer下MySQL/Apache/MariaDB版本安装与切换

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、版本切换指南总结 前言 由于有几个项目分别使用到PHP7.0 和7.4以及8.0版本&#xff0c;设置mysql也会根据PHP版本使用不同的版本&#xff0c;于是开始研究…

2024年数维杯数学建模C题天然气水合物资源量评价解题全过程论文及程序

2024年数维杯数学建模 C题 天然气水合物资源量评价 原题再现&#xff1a; 天然气水合物&#xff08;Natural Gas Hydrate/Gas Hydrate&#xff09;即可燃冰&#xff0c;是天然气与水在高压低温条件下形成的类冰状结晶物质&#xff0c;因其外观像冰&#xff0c;遇火即燃&#…

Graphpad Prism for Mac医学绘图

Graphpad Prism for Mac医学绘图 文章目录 Graphpad Prism for Mac医学绘图一、介绍二、效果三、下载 一、介绍 GraphPad Prism for Mac是一款功能强大、易于使用的科学和统计分析软件&#xff0c;适用于各种类型的数据处理和可视化需求。无论您是进行基础研究、临床试验还是学…

Android实践开发制作小猴子摘桃小游戏

Android实践制作小猴子摘桃小游戏 实践素材项目源文件获取&#xff1a;Android可能存在版本差异项目如果不能正确运行&#xff0c;可以使用里面的素材自己构建项目Android实践制作小猴子摘桃小游戏Android实践制作小猴子摘桃小游戏https://mp.weixin.qq.com/s/jNU_hVfj9xklsil…

Postman 下载文件指南:如何请求 Excel/PDF 文件?

在 Postman 中进行 Excel/PDF 文件的请求下载和导出&#xff0c;以下是简明的步骤&#xff0c;帮助你轻松完成任务。首先&#xff0c;我们将从新建接口开始&#xff0c;逐步引导你完成整个过程。 Postman 请求下载/导出 excel/pdf 文件教程

21.Excel自动化:如何使用 xlwings 进行编程

一 将Excel用作数据查看器 使用 xlwings 中的 view 函数。 1.导包 import datetime as dt import xlwings as xw import pandas as pd import numpy as np 2.view 函数 创建一个基于伪随机数的DataFrame&#xff0c;它有足够多的行&#xff0c;使得只有首尾几行会被显示。 df …

Elasticsearch客户端工具初探--kibana

1 Kibana简介 Kibana是Elastic Stack&#xff08;ELK&#xff09;中的可视化工具&#xff0c;用于对Elasticsearch中存储的数据进行搜索、分析和可视化展示。它提供了直观的Web界面&#xff0c;支持日志分析、业务监控、数据探索等功能&#xff0c;广泛应用于运维监控、安全分析…

珍珠港海军造船厂的“水魔法”:PcVue赋能造船心脏

导读 项目背景 干船坞运作与控制需求 PcVue SCADA 系统的引入以及系统升级 项目成果 凭借更高的安全性&#xff0c;PcVue 对干船坞的充水和排水过程进行精准控制。 项目背景 珍珠港海军基地与希卡姆空军基地均依托这座历史悠久的港口而发展&#xff0c;该港口在夏威夷原住…

3. 轴指令(omron 机器自动化控制器)——>MC_GearInPos

机器自动化控制器——第三章 轴指令 17 MC_GearInPos变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶重启运动指令▶多重启动运动指令▶异常 示例程序▶动作示例▶梯形图▶结构文本(ST) MC_GearInPos 设定主轴和从轴间的齿轮比&#xff0c;进行电子齿轮动作。 指定…

vue 加载动态效果,自行封装组件

背景&#xff1a; 在项目开发中&#xff0c;会请求接口&#xff0c;就会遇到加载中、加载成功、加载失败、和加载成功但暂无数据等情况。就自行封装了一个加载组件。采用vue3elementsetup组合式写法。 实现效果&#xff1a; 封装组件&#xff1a; //封装组件 <template>…

八目导航 version:1.2

八目导航 version&#xff1a;1.2 网址&#xff1a;https://crbssseooebc.sealoshzh.site/ 日志&#xff1a; 1.美化了页面 2.新增并替换了部分网址 3.不会出现危险网址提示(指的是进入八目导航时) 4.为网址图标增加了动效 5.采用Vue3框架重新实现了该导航 注意&#xff1a;该…

WebWorkers在项目中的使用案例

Worker | 文档 worker 线程的关闭在主线程和 worker 线程都能进行操作&#xff0c;但对 worker 线程的影响略有不同。 // main.js&#xff08;主线程&#xff09; const myWorker new Worker(/worker.js); // 创建worker myWorker.terminate(); // 关闭worker 复制代码 // wor…