- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
OSStatus MusicPlayerCallback (
void * inRefCon,
AudioUnitRenderActionFlags * ioActionFlags,
const AudioTimeStamp * inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList * ioData) {
MusicPlaybackState *musicPlaybackState = (MusicPlaybackState*) inRefCon;
double sampleinp;
double A,omega,sn,cs,alpha,Bandwidth;
double dbGain;
double a0,a1,a2,b0,b1,b2;
dbGain = 1.0;
A=pow(10.0,dbGain/40.0);
Bandwidth = 2.0;
omega=2 * M_PI * 800.0/44100.0;
sn=sin(omega);
cs=cos(omega);
alpha=sn*sinh(((M_LN2/2)*Bandwidth*omega)/sn);
//Peak Filter Biquad
b0 =1.0 + alpha * A;
b1 = (-2.0 * cs);
b2 = 1.0 - alpha * A;
a0 = 1.0 + (alpha /A);
a1 = -2.0 * cs;
a2 = 1.0 - (alpha /A);
double b0a0, b1a0, b2a0, a1a0, a2a0;
double static x1;
double static x2;
double static y1;
double static y2;
b0a0=b0/a0;
b1a0=b1/a0;
b2a0=b2/a0;
a1a0=a1/a0;
a2a0=a2/a0;
for (int i = 0 ; i < ioData->mNumberBuffers; i++){
AudioBuffer buffer = ioData->mBuffers[i];
AudioSampleType *outSample = buffer.mData;
for (int j = 0; j < inNumberFrames*2; j++){
sampleinp = *musicPlaybackState->samplePtr++;
outSample[j] = b0a0 * sampleinp +
b1a0 * x1 +
b2a0 * x2 -
a1a0 * y1 -
a2a0 * y2;
x2=x1;
x1=sampleinp;
y2=y1;
y1=outSample[j];
}}
return noErr;
}
有点击/弹出问题。有人请帮助......我不知道我做错了什么。这是在 Xcode 中使用 Objective-C 中的 C。我尝试制作 Coeff Global 和 Static 但没有成功。使用的音频文件是 .caf 我试过 .wav 但还是不行....
谢谢,对于普遍的求救声感到抱歉。我是这个网站的新手。我想在我的应用程序中添加一个峰值过滤器,但每次我使用 slider 或将增益保持在 1 时,我都会听到爆裂声和咔哒声。似乎一切都在那里,并且就保持以前的样本等而言正常工作。当改变频率或带宽时,我也会得到某种类型的相位。几个月来我一直在研究 dsp,我很困惑,我认为这是 Objective-C 的问题和一个小的用户错误。将样本更改为 SInt32 时它似乎消失了,但在更改频率时左声道消失了。
Dsp.h
typedef struct {
void* audioData;
UInt32 audioDataByteCount;
SInt16 *samplePtr;
} MusicPlaybackState;
最佳答案
根据 hotpaw2 的回答,这是您的过滤器响应的图表:
from pylab import *
import scipy.signal as signal
def biquad_peak(omega, gain_db, bandwidth):
sn = sin(omega)
cs = cos(omega)
alpha = sn * sinh(log(2) / 2 * bandwidth * omega / sn)
gain_sqrt = 10.0 ** (gain_db / 40.0)
# feed-forward coefficients
b0 = 1.0 + alpha * gain_sqrt
b1 = -2.0 * cs
b2 = 1.0 - alpha * gain_sqrt
# feedback coefficients
a0 = 1.0 + (alpha / gain_sqrt)
a1 = -2.0 * cs
a2 = 1.0 - (alpha / gain_sqrt)
# normalize by a0
B = array([b0, b1, b2]) / a0
A = array([a0, a1, a2]) / a0
return B, A
omega = 2 * pi * 800.0 / 44100.0
gain_db = 1.0
bandwidth = 2.0
B, A = biquad_peak(omega, gain_db, bandwidth)
w, H = signal.freqz(B, A)
f = w / pi * 22050.0
plot(f, abs(H), 'r')
gain = 10.0 ** (gain_db / 20.0)
print "Gain:", gain
plot(f, gain*ones(len(f)), 'b--'); grid()
峰值增益设置为 1.1220184543(即 1 dB)。您可以看到滤波器如何使大部分可听范围的增益大于 1。
编辑 2:如果这是用于可调 EQ,则由用户设置避免失真的增益。另外,我怀疑您描述的极端问题是由典型音轨在窄带上 1 dB 的轻微增益引起的。我认为这是因为您的音频具有交错的立体声数据。这些 channel 中的每一个都需要单独过滤。我已经尝试修改您的嵌套循环来完成此任务:
a0 = 1.0 + alpha / A;
a1 = -2.0 * cs / a0;
a2 = (1.0 - alpha / A) / a0;
b0 = (1.0 + alpha * A) / a0;
b1 = -2.0 * cs / a0;
b2 = (1.0 - alpha * A) / a0;
double static x11, x12, x21, x22;
double static y11, y12, y21, y22;
double x0, y0;
for (int i = 0; i < ioData->mNumberBuffers; i++) {
AudioBuffer buffer = ioData->mBuffers[i];
AudioSampleType *outSample = buffer.mData;
for (int j = 0; j < inNumberFrames*2; j++) {
/* x0 is in the range of SInt16: -32768 to 32767 */
x0 = *musicPlaybackState->samplePtr++;
y0 = b0 * x0 +
b1 * x11 +
b2 * x12 -
a1 * y11 -
a2 * y12;
outSample[j] = fmax(fmin(y0, 32767.0), -32768.0);
x12 = x11;
x11 = x0;
y12 = y11;
y11 = y0
j++;
x0 = *musicPlaybackState->samplePtr++;
y0 = b0 * x0 +
b1 * x21 +
b2 * x22 -
a1 * y21 -
a2 * y22;
outSample[j] = fmax(fmin(y0, 32767.0), -32768.0);
x22 = x21;
x21 = x0;
y22 = y21;
y21 = y0;
}
}
关于iphone - 峰值滤波器有咔哒声和爆裂声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4840492/
我尝试获取processID的峰值(win7音频混音器中绿色条的电平),例如5640-Spotify。 在互联网上搜索了一个好的图书馆。我找到了CSCore。 现在我有这个: class Progra
这里描述并回答了问题:https://groups.google.com/forum/#!topic/redis-db/egyA1xvhGfo 很遗憾,我没有完全理解答案。 我担心的是,如果 Redi
我有一些音频数据(浮点数数组),我用它来绘制一个简单的 波形。 绘制时,波形不会在边缘达到最大值。 没问题 - 数据只需要标准化。我迭代一次以找到最大值,然后再次迭代将每个除以最大值。再次绘制,一切看
将数组划分为最大数目的相同大小的块,每个块应包含一个索引P,以使A [P-1] A [P + 1]。 我的解决方案:golang solution 但是部分性能测试无故失败,有人可以提出一些建议吗?
我们有一个专用的数据库服务器,在 linux debian 上运行 PostgreSQL 8.3。定期查询数据库以获取大量数据,同时更新/插入也经常发生。数据库会周期性地在短时间内(例如 10 秒)不
我正在使用此 python 代码的稍微修改版本来进行频率分析: FFT wrong value? 假设我在时域中有一组正弦波,它们的频率非常接近,同时共享相同的振幅。这是它们在频域中的样子,对 102
我正在尝试找到一种方法使现有(专有)Linux 进程消耗大量 CPU 或使其过于繁忙以致于停止响应其他进程但不重新生成。 目前我所拥有的只是它在用户空间中的 pid。也许对进程的某种超快速 ping
我们在应用程序中使用 Redis 处理一些数据,这非常棒。不过,我注意到 redis-server 进程偶尔会出现 cpu 和内存峰值。 这是 Giraffe dashboard来 self 们的生产
我有一个 SwiftUI 项目和一个绑定(bind)到 EnvironmentObject 的 View 。该对象包含一个@Published 属性。 import Foundation class
我们目前使用的 VMOptions 如下所示,用于我们使用 spring webflux 设计的微服务之一。我们目前为每个 pod 预留了 4 个 CPU 和 5 GB 内存。 -Xms4096m -
我们目前使用的 VMOptions 如下所示,用于我们使用 spring webflux 设计的微服务之一。我们目前为每个 pod 预留了 4 个 CPU 和 5 GB 内存。 -Xms4096m -
我正在拼命寻找由于 CPU 峰值(18-19 个核心,100% 负载)导致的 Eclipse 卡住瞬间(最多 2-3 秒)的问题。在峰值期间什么都不起作用,整个 eclipse 只是没有反应。自从我修
我的工作涉及振动,我试图从 FFT 幅度中获取以下信息: 峰值到峰值 峰值 RMS 我正在对一个简单的正弦波函数执行 FFT,考虑汉宁窗。请注意,正弦波函数的“全振幅”为 5,运行 FFT 下面的代码
我们有一个位于负载平衡器后面的服务器池。这个池中的机器平均每 6 秒进行一次垃圾收集。垃圾收集需要将近半秒的时间。我们还看到在垃圾收集期间出现 CPU 峰值。 客户端计算机在一天内连接到服务器的平均时
有人知道为什么我们的 Amazon RDS 数据库的 CPU 使用率每小时会出现峰值吗?我们没有每小时运行任何 cron,因此它似乎是一些内部 RDS 的东西,因为它恰好是每小时运行一次。 RDS 是
我试图发现为什么 mysqld 有时会使 cpu 饱和并停止。 我怀疑这与更新索引或其他此类维护有关。我想证明这个假设并寻找避免它的选项。 情况是这样的。我有几十张 table ,但根据事件,似乎至少
已解决 在我们的例子中,问题是对于 SuggestRequestHandler (requestHandler name="/suggest") 现在已经设置了 facelimit:10此外,应用程序
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我正在尝试使用 ALSA 和 C 检索当前音频峰值。我希望将该值作为 0.0 到 1.0(或者可能是 0 到 100)之间的标量。在 Windows 上我使用 IAudioMeterInformati
我是一名优秀的程序员,十分优秀!