- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我用 python 制作了一个原型(prototype),然后将其转换为 iOS 应用程序。不幸的是,scipy 和 numpy 的所有优秀特性在 objective-C 中都不可用。所以,显然我需要从头开始在 objective-c 中实现一个过滤器。作为第一步,我尝试在 python 中从头开始实现 IIR。如果我能理解如何在 python 中执行此操作,我将能够在 C 中对其进行编码。
作为旁注,对于在 iOS 中进行过滤的资源的任何建议,我将不胜感激。作为习惯使用 matlab 和 python 的 objective-c 的新手,我很震惊,音频工具箱和加速框架和惊人的音频引擎之类的东西没有与 scipy.signal.filtfilt 等效的东西,也没有像 scipy 这样的过滤器设计功能。 signal.butter 等
所以,在下面的代码中,我以五种方式实现了过滤器。 1) scipy.signal.lfilter(用于比较),2) 使用由 Matlab 的 butter 函数计算的 A、B、C、D 矩阵的状态空间形式。 3) 使用由 scipy.signal.tf2ss 计算的 A、B、C、D 矩阵的状态空间形式。 4) 直接形式 I,5) 直接形式 II。
如您所见,使用 Matlab 矩阵的状态空间形式非常适合我在我的应用程序中使用它。但是,我仍在寻求理解为什么其他人不能很好地工作。
import numpy as np
from scipy.signal import butter, lfilter, tf2ss
# building the test signal, a sum of two sines;
N = 32
x = np.sin(np.arange(N)/6. * 2 * np.pi)+\
np.sin(np.arange(N)/32. * 2 * np.pi)
x = np.append([0 for i in range(6)], x)
# getting filter coefficients from scipy
b,a = butter(N=6, Wn=0.5)
# getting matrices for the state-space form of the filter from scipy.
A_spy, B_spy, C_spy, D_spy = tf2ss(b,a)
# matrices for the state-space form as generated by matlab (different to scipy's)
A_mlb = np.array([[-0.4913, -0.5087, 0, 0, 0, 0],
[0.5087, 0.4913, 0, 0, 0, 0],
[0.1490, 0.4368, -0.4142, -0.5858, 0, 0],
[0.1490, 0.4368, 0.5858, 0.4142, 0, 0],
[0.0592, 0.1735, 0.2327, 0.5617, -0.2056, -0.7944],
[0.0592, 0.1735, 0.2327, 0.5617, 0.7944, 0.2056]])
B_mlb = np.array([0.7194, 0.7194, 0.2107, 0.2107, 0.0837, 0.0837])
C_mlb = np.array([0.0209, 0.0613, 0.0823, 0.1986, 0.2809, 0.4262])
D_mlb = 0.0296
# getting results of scipy lfilter to test my implementation against
y_lfilter = lfilter(b, a, x)
# initializing y_df1, the result of the Direct Form I method.
y_df1 = np.zeros(6)
# initializing y_df2, the result of the Direct Form II method.
# g is an array also used in the calculation of Direct Form II
y_df2 = np.array([])
g = np.zeros(6)
# initializing z and y for the state space version with scipy matrices.
z_ss_spy = np.zeros(6)
y_ss_spy = np.array([])
# initializing z and y for the state space version with matlab matrices.
z_ss_mlb = np.zeros(6)
y_ss_mlb = np.array([])
# applying the IIR filter, in it's different implementations
for n in range(N):
# The Direct Form I
y_df1 = np.append(y_df1, y_df1[-6:].dot(a[:0:-1]) + x[n:n+7].dot(b[::-1]))
# The Direct Form II
g = np.append(g, x[n] + g[-6:].dot(a[:0:-1]))
y_df2 = np.append(y_df2, g[-7:].dot(b[::-1]))
# State space with scipy's matrices
y_ss_spy = np.append(y_ss_spy, C_spy.dot(z_ss_spy) + D_spy * x[n+6])
z_ss_spy = A_spy.dot(z_ss_spy) + B_spy * x[n+6]
# State space with matlab's matrices
y_ss_mlb = np.append(y_ss_mlb, C_mlb.dot(z_ss_mlb) + D_mlb * x[n+6])
z_ss_mlb = A_mlb.dot(z_ss_mlb) + B_mlb * x[n+6]
# getting rid of the zero padding in the results
y_lfilter = y_lfilter[6:]
y_df1 = y_df1[6:]
y_df2 = y_df2[6:]
# printing the results
print "{}\t{}\t{}\t{}\t{}".format('lfilter','matlab ss', 'scipy ss', 'Direct Form I', 'Direct Form II')
for n in range(N-6):
print "{}\t{}\t{}\t{}\t{}".format(y_lfilter[n], y_ss_mlb[n], y_ss_spy[n], y_df1[n], y_df2[n])
输出:
lfilter matlab ss scipy ss Direct Form I Direct Form II
0.0 0.0 0.0 0.0 0.0
0.0313965294015 0.0314090254837 0.0313965294015 0.0313965294015 0.0313965294015
0.225326252712 0.22531468279 0.0313965294015 0.225326252712 0.225326252712
0.684651781013 0.684650012268 0.0313965294015 0.733485689277 0.733485689277
1.10082931381 1.10080090424 0.0313965294015 1.45129994748 1.45129994748
0.891192957678 0.891058879496 0.0313965294015 2.00124367289 2.00124367289
0.140178897557 0.139981099035 0.0313965294015 2.17642377522 2.17642377522
-0.162384434762 -0.162488434882 0.225326252712 2.24911228252 2.24911228252
0.60258601688 0.602631573263 0.225326252712 2.69643931422 2.69643931422
1.72287292534 1.72291129518 0.225326252712 3.67851039998 3.67851039998
2.00953056605 2.00937857026 0.225326252712 4.8441925268 4.8441925268
1.20855478679 1.20823164284 0.225326252712 5.65255635018 5.65255635018
0.172378732435 0.172080718929 0.225326252712 5.88329450124 5.88329450124
-0.128647387408 -0.128763927074 0.684651781013 5.8276996139 5.8276996139
0.47311062085 0.473146568232 0.684651781013 5.97105082682 5.97105082682
1.25980235112 1.25982698592 0.684651781013 6.48492462347 6.48492462347
1.32273336715 1.32261397627 0.684651781013 7.03788646586 7.03788646586
0.428664985784 0.428426965442 0.684651781013 7.11454966484 7.11454966484
-0.724128943343 -0.724322419906 0.684651781013 6.52441390718 6.52441390718
-1.16886662032 -1.16886884238 1.10082931381 5.59188293911 5.59188293911
-0.639469994539 -0.639296371149 1.10082931381 4.83744942709 4.83744942709
0.153883055505 0.154067363252 1.10082931381 4.46863620556 4.46863620556
0.24752293493 0.247568224184 1.10082931381 4.18930262192 4.18930262192
-0.595875437915 -0.595952759718 1.10082931381 3.51735265599 3.51735265599
-1.64776590859 -1.64780228552 1.10082931381 2.29229811755 2.29229811755
-1.94352867959 -1.94338167159 0.891192957678 0.86412577159 0.86412577159
最佳答案
看FIR wiki ,以及这个公式:
所以首先你自己生成一个汉明窗口(我仍在使用 python 但你可以将其转换为 c/cpp):
def getHammingWin(n):
ham=[0.54-0.46*np.cos(2*np.pi*i/(n-1)) for i in range(n)]
ham=np.asanyarray(ham)
ham/=ham.sum()
return ham
然后你自己的低通滤波器:
def myLpf(data, hamming):
N=len(hamming)
res=[]
for n, v in enumerate(data):
y=0
for i in range(N):
if n<i:
break
y+=hamming[i]*data[n-i]
res.append(y)
return np.asanyarray(res)
pass
关于python - 如何实现像 scipy.signal.lfilter 这样的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20917019/
来自Unix&Linux Stack Exchange的 This question was migrated,因为可以在Stack Overflow上进行回答。
所以我有这段代码(部分取自 python 文档): import signal def handler(signum, frame): print 'Signal handler called
是否可以在信号块中调用用户定义的方法? method my-method ( ... ) { signal(SIGTERM,SIGINT,SIGQUIT,SIGHUP).tap( -> $si
我正在研究一个类的概念性伪代码信号量分配。 我想知道是否可以在某个进程调用 wait() 之前在信号量上调用 signal()。例如: Shared data: Semaphore x = 0; Pr
我正在为远程调试注册一个信号: signal.signal(signal.SIGUSR1, lambda x,y: remote_debug(x, y, emp_id)) 虽然通常非常快,但日志语句显
关于 PySide signals and slots page它说:“信号是实例拥有的运行时对象,它们不是类属性”。显然,QObject 构造函数在 Signals 的类属性中查找并将它们复制到对象
关于 PySide signals and slots page它说:“信号是实例拥有的运行时对象,它们不是类属性”。显然, QObject 构造函数查找 Signals 的类属性并将它们复制到对象实
关于PySide signals and slots page它说:“信号是实例拥有的运行时对象,它们不是类属性”。显然,QObject 构造函数在类属性中查找信号并将它们复制到对象实例。我的测试程序
使用 ReactiveCocoa,我如何从重复信号中链接信号? 我想做这样的事情:每 5 秒,我运行一次网络请求。 为此,我创建了一个重复信号 RACSignal *each5SecondSignal
正如标题中所写 - “信号和插槽”是一种简单的响应式(Reactive)编程方式吗? 最佳答案 Signals/Slots是 Observer Pattern 的实现. 来自维基 Reactive P
您好,我想知道信号声明如何在 VHDL 中真正起作用。它是否意味着延迟,因为它是内部信号?信号有内部存储器吗? 例子: Architecture SD_BEH of SD is signal C: s
我正在尝试编写一些代码来使用 python 执行一些数据包嗅探 使用 pyshark.I 有以下一段代码: import pyshark print('Pyshark demo') capture =
**披露 - 我是一名初学者 C 程序员,并不完全熟悉如何解释手册页,也不完全熟悉谈论 C 时正确的单词选择 - 对这个问题的任何编辑或澄清都是感谢。* 问题:我正在阅读有关 signal(7) 的手
我的应用程序运行完美,没有任何问题。但是当我尝试调试它时,android studio 卡住了。所以我收到消息“等待调试器”,然后该消息消失,接下来我在模拟器中只看到黑屏。 我也收到了消息 SIGNA
我在 Laravel 5.7 中使用 Snappy PDF 库。在本地一切正常,但在我的开发环境中出现此错误:该进程已收到信号“11”的信号。到现在为止,我找不到可以帮助我的解决方案。这是我在 Con
当我想在 linux 上激活 mongo 时,我得到了这个错误,它不会工作 $ sudo systemctl status mongod ● mongod.service - MongoDB 数据库服
我正在尝试设置函数超时,但我无法成功。 我运行来自 https://docs.python.org/3/library/signal.html?highlight=signal%20sigalrm#e
我在尝试使用 Phantomjs 和 Symfony 的 Process 和 Reposonse 文件创建 PDF 文档时遇到此错误。 这是我收到的错误信息 fatal error :未捕获的异常 '
我正在尝试调试一个复杂的 Perl 应用程序,该应用程序以错误消息“收到信号 SIGCHLD,但未设置信号处理程序”而终止。我知道它来自 Perl 解释器本身,特别是来自文件 mg.c它不能被捕获。但
我有以下代码,它按预期工作: import signal def printer(signum, frame): print("hi!") signal.signal(signal.SIGAL
我是一名优秀的程序员,十分优秀!