图片缩略图

完成潘汤普金斯心电图QRS检测器的实现

版本1.8 (129kb) Hooman Sedghamiz
基于Pan Tompkins算法检测心电信号中的QRS复数
4.7
50评级

159下载

更新2018年4月8日

查看版本历史

查看许可协议

完全实现Pan Tompkins;
如果你觉得这个脚本有用,请引用以下参考文献;
%%
% [1] Sedghamiz。H,“Pan Tompkins心电图QRS检测器的Matlab实现”,2014年3月。https://www.researchgate.net/publication/313673153_Matlab_Implementation_of_Pan_Tompkins_ECG_QRS_detect

%[2]。J,汤普金斯。王俊杰,“一种实时QRS检测算法”,IEEE
生物医学工程学报,vol. bme-32, no .;1985年3月3日。
作者:Hooman Sedghamiz
%林雪平大学
%邮箱:hoose792@student.liu.se
版权所有2014年3月
-----------------
方法:
% %预处理
% 1)带通滤波器(5- 15hz)
% 2)衍生滤镜到高光QRS复合体。
% 3)信号的平方。
% 4)信号是噪声(0.150秒长度)的平均值。
% 5)根据采样频率对你的信号进行滤波
%选项已更改,以最佳匹配您的心电信号的特征
决策规则
在算法的这一点上,前面的阶段产生了一个大致的脉冲形状
%波形在留言灯的输出。至于这个脉冲是否确定
%对应于QRS复波(相对于高倾斜t波或噪声人工效应)为
%执行自适应阈值操作和其他决策
%规则概述如下;
% a)基准标记-首先对波形进行处理,以产生一组加权单位
%的样本在MWI最大值的位置。这样做是为了本地化QRS
%复杂到单个瞬间的时间。w[k]权重是最大值。
% b) THRESHOLDING -当分析MWI输出的振幅时,算法使用
%两个阈值(THR_SIG和THR_NOISE),在概要过程中适当初始化
% 2第二训练阶段),不断适应变化的心电信号质量。的
%第一次通过y[n]使用这些阈值对每个非零样本进行分类
% (CURRENTPEAK)作为信号或噪声:
%如果CURRENTPEAK > THR_SIG,则该位置被标识为“QRS复合体”
% candidate”,信号电平(SIG_LEV)被更新:
% sig _ Lev = 0.125 ×currentpeak + 0.875× sig _ Lev
如果THR_NOISE < CURRENTPEAK < THR_SIG,则该位置被标识为
%“噪音峰值”和噪音级别(NOISE_LEV)更新:
%噪声_ Lev = 0.125×currentpeak + 0.875×噪声_ Lev
%基于信号和噪声电平(SIG_LEV和NOISE_LEV)的新估计,
%)在心电图的该点,阈值调整如下:
% THR _ sig =噪声_ Lev + 0.25 × (sig Lev ?噪音_ Lev)
% thr_噪声= 0.5× (thr_ sig)
这些调整逐渐降低阈值的信号段,认为
质量较差。
% c) SEARCHBACK FOR missing QRS complex -在上面的阈值步骤中,如果
% CURRENTPEAK < THR_SIG,则认为该峰值不是由QRS产生的
%复杂。然而,如果不合理的长时间已经过期,而没有超过阈值
%峰值时,算法将假设一个QRS已经错过并执行
% searchback。这限制了假阴性的数量。触发的最小时间
%一次回搜是当前R峰值到R峰值时间段(称为RR
%间隔)。这个值有一个生理来源——相邻时间值
心跳的变化不能比这更快。。假设缺失的QRS复合体
%发生在位于THR_SIG和
% THR_NOISE。在该算法中,存储了两个平均RR间隔,第一个RR间隔为
%计算为最后八个QRS位置的平均值,以适应不断变化的心脏
%,第二个RR区间均值为均值
最常规RR间隔的%。如果心率不规律,阈值就会降低
%以提高检测。
d)在不应期内消除多次检测-是的
%不可能发生一个合法的QRS复合体,如果它是在前一个
%检测到一个。这种限制是生理上的-由于期间的不应期
即使有刺激,心室去极化也不会发生。作为QRS复合体
%的候选,算法消除了这些物理上不可能发生的事件,
%,从而减少误报。
% e) T波辨别-最后,如果一个QRS候选出现在200ms之后
%不应期但在360ms内的前QRS,算法确定
%这是真正的QRS复合体的下一次心跳还是异常突出
% T波。这个决定是基于波形在该位置的平均斜率。斜率为
%小于前QRS复合体的一半则与慢相一致
%改变T波的行为-否则,它就变成了QRS探测。
额外的概念:除了在论文中提到的几点,本代码也
%检查是否发生的峰值小于360毫秒的延迟也有
%延迟小于0.5 *mean_RR如果是,这将被算作噪音

引用作为

胡曼·塞德哈米兹(2020)。完成潘汤普金斯心电图QRS检测器的实现(//www.tatmou.com/matlabcentral/fileexchange/45840-complete-pan-tompkins-implementation-ecg-qrs-detector), MATLAB中央文件交换。检索

意见及评分(101

安德鲁·许

非常简单,超级完整。
谢谢你!

SEHYUN公园

谁能给我解释一下导数滤波器的部分?

如果fs ~= 200
Int_c = (5-1)/(fs*1/40);
b = interp1(1:5(1 2 0 2 1)。* (1/8)* fs, 1: int_c: 5);

你好

Paavan Gouniyal

感谢您的分享,我正在学习生物医学工程,刚刚在我的生物医学信号处理课程中介绍了这个算法,我在理解自适应阈值过程方面有一些困难,如果您能提供一个解释,为我简化它,我会感激任何帮助。再次感谢,

Paavan

Faizan Javed

非常感谢sedghammiz,一个简单的问题,我有一个夜间心电图记录,信号振幅突然下降,可能是由于身体姿势。该算法不能适应阈值,对低幅值的部分进行拒绝。解决这个问题的最好办法是什么?

艾拉克雷曼

嗨,有个小问题
无论我输入什么大小的心电矢量,R指标的结果保持不变。我的意思是向量R的大小表示R的下标总是167。我怎么解决它?我不明白问题的根源

好高

好了!

Kiruthika Balakrishnan

非常感谢,塞德哈米兹先生。
有人能告诉我如何找到FN和FP吗?

Paramonte

当心电采样频率不大于200时,采用不同的滤波准则。为什么

Jokand

良好的工作

Taissir Fekih

非常感谢这段代码。我想知道我们如何评估qrs探测器的方法,计算探测的灵敏度和精度?
谢谢

是女士巴里斯

不工作

米格尔·卡萨斯

记录的敏感性和预见性都很低:
感性Predictvity
108m 50,9937% 42.74155%
2.07亿12.3659% 10.37438%
31.29529% 31.323663%

如何提高敏感性和可预测性?

Priyadharshan拉马纳坦

我得到如下错误

“输入参数不够。

pan_tompkins错误(第43行)
如果~ isvector (ecg)”

如何解决?

马克斯Wichmann

有可能探测到p波吗

Shengwen罗

gfhgfd hgfd

我可以翻译成java语言吗?

khouloud daboussi

为什么它总是显示这个?

使用pan_tompkin错误(第47行)
Ecg必须是行或列向量

我使用来自physionet.org的心电信号

iwantrugs

这就跟你问声好!当我尝试使用这个时,我会得到一个非常奇怪的错误;

使用findpeaks出错
输出参数太多。
pan_tompkin错误(第156行)
[pks,locs] = findpeaks(ecg_m,'MINPEAKDISTANCE',round(0.2*fs));

什么好主意吗?

杰西卡·迪比克

蒋禄卡Finotti

看起来很棒,但是,你能添加一个输出与R-Peaks对应的样本吗?

Hooman Sedghamiz

有关ECG分析和QRS和T波检测的更多算法,请参阅我最近提交的BioSigKit:
//www.tatmou.com/matlabcentral/fileexchange/67805-biosigkit-a-toolkit-for-bio-signal-analysis?s_tid=prof_contriblnk

马赫迪Torabi

Hooman,

非常感谢你的算法。它非常适合峰值检测。有没有办法用这个算法找出指数为R个峰的脉冲序列?

马修保罗

Songsheng朱

阿希斯达斯

感谢胡曼提供的代码。但它不能正常工作与MIT-BIH 101记录。我有一个查询-如何获得那些包含所有输出的变量。这里只有一个变量在成功运行后出现,即“ans”。请告诉如何获得包含峰值位置的其他变量…等等…请帮助……

bhan斯托克斯

在MIT-BIH正常窦性心律数据库中,该程序没有检测到正确的R峰。您能否建议在这个函数文件中需要做任何修改,以便检测到正确的R峰。采样频率设置为360hz。请帮助

Pavithra R

伙计们如何在这段代码中加载我的数据集??请帮助

Myat Pan Naw

丹尼尔•科恩

非常感谢,塞德哈米兹先生。
你建议如何在不使用“findpeaks”这样的内置函数的情况下找到峰值?

布兰登·约翰逊

这是一个完整的特征提取器吗?

你好,塞德哈米兹先生。H,首先非常感谢你分享这些代码,并祝贺你所做的工作。我想问一下:为什么在学习阶段1要取最大振幅的0.25来计算THR_SIG,是来自Pan Tomkins的论文吗?然后,你说的是最大振幅的0.25,但你的公式是:THR_SIG = max(ecg_m(1:2*fs))*1/3。这是个错误吗?
提前谢谢大家!

crisliu

你好,谢谢你的工作!你能分享这些代码真是太好了。但是我有一个问题要问,如何确定心电图的频率?当我想用我自己的数据时,期待您的回复谢谢!!

Warda Arora

我已经实现了这段代码直到过滤器,但我在实现阈值部分时遇到了麻烦。
我不明白的是,用什么来初始化下面的变量?
qrs_c = [];
qrs_i = [];
nois_c = [];
nois_i = [];
qrs_i_raw = [];
qrs_amp_raw = [];
SIGL_buf = [];
NOISL_buf = [];
THRS_buf = [];
SIGL_buf1 = [];
NOISL_buf1 = [];
THRS_buf1 = [];
如能迅速回复,将不胜感激。提前谢谢你。

我在一个项目中使用睡眠呼吸暂停心电图信号。我想用这个来检测R峰但是这个代码的过滤对这种类型的信号有效吗?我猜这个滤波是针对有噪声的标准心电信号的。

minderis krir

我是matlab的新手,我想知道输入!如何从MIT-BIH数据库导入数据并用作此脚本的输入?命令是什么?
和谢谢

杰夫•李

详细说明我的评论
我似乎是这么想的
Int_c = (5-1)/(fs*1/50)是更合理的
插值技术得到新的导数滤波器,有什么想法?

杰夫•李

我理解有问题
Int_c = (5-1)/(fs*1/40);
b = interp1(1:5(1 2 0 2 1)。* (1/8)* fs, 1: int_c: 5);
不知道它是如何修改fs到衍生过滤器的,这是为了代码!!

穆克什rathod

谢谢一个代码,但当我运行它发现一个错误,如没有足够的输入参数。(第118行)请帮帮我。

萨尔玛

谢谢你的代码
但是当我运行它时,我发现了这个错误
Pan_tompkin (ecg, fs, gr)
使用ecg时出错(第22行)
输入参数不够。

“云飞

非常感谢您提供的代码,但是MIT-BIH 114记录的数据似乎工作不太好,缺少太多峰值,请检查。

Huda迪亚布

我在等你帮我回答最后一个问题。

Huda迪亚布

非常感谢这段代码,它与您的示例数据运行。我是matlab的新手,我需要帮助,我的ECG在垫子格式取自physionet,这是很长的。我怎么能让这个代码与这么长的心电信号工作。另外,如何找到R峰的值,以及如何使用该算法计算RR区间。请帮帮我!

另一次

太好了!浏览了几个数据文件到目前为止还没漏掉一个,没有双关语的意思。伟大的工作!

Dhiraj Ramnani

非常感谢Pan Topkins的正确实施。现在,一旦我们得到了检测到的R峰的指数,我们就可以检测到整个qrs复合体,包括R峰左右的一些样本。那么,检测qrs复数的样本数量是多少呢?

Hooman Sedghamiz

好的,我注意到Pan-Tompkins论文中提出的原始滤波器的Matlab实现不能实现5-12 Hz的带通。不管怎样,我在脚本中注释了它们,以防有人想使用它。对此有任何想法欢迎:)

大卫·j·麦克

延迟现在没有正确初始化(取消注释第134行?)

你好,大卫

Hooman Sedghamiz

乔治亚和以色列,你们是对的。高通滤波器的脉冲响应错误。刚刚更新了。斧头手柄的问题也修复了。很快,我将上传一个不使用matlab中任何内置函数(如findpeaks)的版本,它将非常类似于实时实现。

谢谢反馈!

Giorgia卡拉

Israel Yohannes我同意你的观点。我不明白为什么过滤器的系数是:
B = [-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 -32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1];
A = [1 -1];
而不是:
B = [-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1];
A = [1 1];

我可以检测PQ,QP,RT,TR,PS和SP使用这个算法请尽快指导。
谢谢

大卫·帕尔曼

您好,在当前版本R2016b下,这似乎不再工作。我不确定这些变化是什么时候发生的。不过,解决方法很简单。

我收到的错误是:
>> [qrs_amp_raw,qrs_i_raw,delay]=pan_tompkin(S1B_r1_ekg, 1000);
从matlab.graphics.Graphics转换为逻辑不可能。

pan_tompkin中的错误(第434行)
如果斧子(:)

这似乎与图形句柄现在是对象而不是双精度对象有关:
//www.tatmou.com/help/matlab/graphics_transition/graphics-handles-are-now-objects-not-doubles.html

我能够通过在第433行添加isgraphics(ax(:))来纠正这个错误。更改之后,函数运行时不会出现错误。

以色列遗址上

高通滤波器系数正确吗?

代码:
B = [-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 -32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1];
A = [1 -1];

我觉得应该是
B = [-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1];
A = [1 1];

纳比尔Ch

@nur, 1x25表示代码检测到25个峰。第一个矩阵将显示这25个振幅,第二个矩阵将显示它们的位置(索引)。第三个变量是延迟。

纳比尔Ch

对某些信号不起作用。我正在寻找问题所在。

努尔Shahirah

我有一个问题,关于如何确定r的峰值?例如,它是否在工作区中被保存为“ans”?因为它只是给我一个值的列,(在矩阵中准确地1X25),我不知道值的目的。谢谢。我仍然是一个初学者,真的想知道这是如何工作的,特别是在这个代码函数[qrs_amp_raw,qrs_i_raw,delay]=pan_tompkin_revised(ecg,fs,gr)

杨旭

干得好,非常感谢

本李

帮了大忙,谢谢

shidong朱

谢谢

假设

谢谢!

麒麟刘

很好

塞尔玛塞尔玛

非常感谢,但我有一个错误在这一行
[pks,locs] = findpeaks(ecg_m,'MINPEAKDISTANCE',round(0.2*fs));
我该如何解决呢

王的估值

zjradty

非常感谢!

Souzka

droval

程序看起来真的很好,但我得到这个错误:

从matlab.graphics.Graphics转换为逻辑不可能。

pan_tompkin中的错误(第433行)

我调用的函数从一个脚本与以下一行:
[qrs_amp_raw qrs_i_raw,延迟]= pan_tompkin (x, fs);
x是信号,fs是采样频率。

你知道哪里出了问题吗?这是EOG信号,不是ECG,所以略有不同,但我认为它应该可以找到QRS。提前感谢你的帮助。

套Sebhatu

张曲

这个程序很好用!!

柴翁辉

大家好,我是matlab的新手。有人能告诉我怎么执行这个程序吗?
我尝试在第一行插入函数,如下所示:
360年pan_tompkin (' ecg.txt ', 1);

它跑不动。请帮忙

萨尔玛

这很有帮助
我想计算心率我怎么做呢这个算法给出2个心率。我怎么解决这个问题?

偃角Elsaadawy

这对我帮助很大。
但我有一个小问题,当我尝试数据是一个74点的矢量…我得到了这个错误
错误==> pan_tompkin在230
THR_SIG = max(ecg_m(1:2*fs))*1/3;最大振幅的% 0.25

任何帮助吗?

Ramanujam E

Pan Tompkins算法显示QRS振幅,但它没有索引'R'峰值。有人能说如何找到R指数的指数吗

阿里娅查图尔维迪

嗨……您的代码运行得非常好。
需要一点帮助..!!!!!
请告诉我计算输入心电信号的HEART RATE的公式。

请尽快回复。
谢谢. . ! !:)

套Sebhatu

Stephan Wegerich

嗨Hooman,

快速的问题。在第212行和第213行

ecg_m = conv (ecg_s,(1,圆(0.150 * fs)) /轮(0.150 * fs));
延迟=延迟+ 15;

但是,延迟量不是只在fs = 200的情况下有效吗?当使用其他采样频率时,移动平均将有不同的长度,因此有不同的延迟。这样不是更好吗:

延迟=延迟+整轮((0.150*fs)/2);

SSAU

胡曼,伟大的工作和伟大的代码!
你能帮我一个问题吗?你认为经典的Pan and Tompkins算法和改进的Hamilton-Tompkins算法哪个更好?

你会用Matlab写Hamilton-Tompkins算法的实现吗?

干杯,亚历克斯!

Mindaugas

第233行:
[pks,locs] = findpeaks(ecg_m,'MINPEAKDISTANCE',0.2*fs);

'MINPEAKDISTANCE'必须是整数,否则我们将得到错误:

使用findpeaks>parse_inputs错误(第77行)
MinPeakDistance应该是一个大于0的整数。

findpeaks中的错误(第43行)
[X,Ph,Pd,Th,Np,Str,异教徒]= parse_inputs(X,varargin{:});

pan_tompkin错误(第233行)
[pks,locs] = findpeaks(ecg_m,'MINPEAKDISTANCE',0.2*fs);

所以你可以用:
[pks,locs] = findpeaks(ecg_m,'MINPEAKDISTANCE',round(0.2*fs));

胡珊

对我来说效果很好,除了零星的高噪声信号,比如这个:https://drive.google.com/file/d/0B0oLTmfsFF6sSk5UeFBGTDNPSWc/edit?usp=sharing

奥托·马克斯

为什么在第340行用了这个不等式?
如果length (qrs_c)> = 3

奥托·马克斯

你好,胡曼·塞德哈米兹!我为我的英语道歉。谢谢你的工作
还有见到她的可能性。我想完全理解
这个算法。我很难在你提供的文件上做,因为它是做的
普遍的。因此,我问你关于算法的选择比较简单
理解的方式。比如只有200赫兹,等等。
如果你给我一个简单的分析选择,我将非常高兴。
真诚。

附言:我觉得用俄语写会更容易吗?

Hooman Sedghamiz

@Govind,说得好。好吧,我想我加上这部分是因为原始论文中的整个斜率分析思想表现得不是很好,不能区分T波。我只是添加了额外的部分来处理这个问题,但最好删除它。在我的空闲时间,我计划通过添加Hamilton算法峰值检测器来增强代码,可以在一定程度上提高精度。马上就上来。

干杯

鹅膏

我认为你需要在做卷积时添加“有效”选项

Govind

谢谢你的好代码。我一直在一些实际信号上运行它,我发现“额外的概念:这段代码也”可能有问题
检查发生的峰值是否小于360毫秒的延迟也有
延迟小于0,5*mean_RR如果是,则算作噪声"

它会导致一些峰值被错过,特别是当信号有PAC时

信号:
http://i.imgur.com/kqyERvu.png

违约行为:
http://i.imgur.com/LLjOn5m.png

“| | (loc (i) -qrs_i(结束))< = (0.4 * test_m)”注释掉:
http://i.imgur.com/OQVqDW5.png

Hooman Sedghamiz

好的。现在你可以使用这个函数作为一个内部函数通过静音图。只要把最后一个输入'gr'设为0。

凯尔

很好,我也是这么想的。另一个建议是:如果能够设置一个标志参数来决定是否应该绘制图形,或者是否应该无声地完成,那就太好了。

Hooman Sedghamiz

谢谢凯尔。延迟是一个变量,表示由于滤波导致信号延迟的采样数。我在文件中添加了描述。

凯尔

非常棒的算法实现,谢谢。你介意为“延迟”输出变量添加一个描述吗?我对它的目的有个概念,但我想确保我说的准确。

非常感谢您的宝贵时间!一开始我忽略了第二个频道

Hooman Sedghamiz

我今天修复了一些小错误,我想现在它会工作得更好。谢谢你的反馈:)

Hooman Sedghamiz

我的错,对不起,我在从physionet导入心电图时犯了一个错误,他们长得多。我只分析了每段的83秒,当然它们更长。

Hooman Sedghamiz

所以,我刚刚在你的数据库中测试了算法,它与论文中的结果高度相关,结果如下:磁带no 100,102, 103,231检测到所有的节拍,没有任何假阴性和假阳性,100%检测到论文中报道的。正如论文中所说,他们对编号108和222的磁带有问题,他们有12.54%和7.33%的检测失败,在磁带108(通道1)上应用我的脚本后,我得到了10个错误检测,如果你把它除以这盘磁带(通道1)中的参考节拍数,你得到11.76(接近论文中的12%),而在磁带222中,我得到8.57%(再次与7.33%相关)。我认为《physionet》中的这些样本并不是《Pan tompkins》中使用的完整磁带,因为如果你查看论文中的例子,在磁带222中,它们总共有2484个节拍,然而,在《physionet》的版本中,2484个节拍中只有105个。我认为这导致了他们在论文中报告的结果和这个脚本的结果之间的细微差异:)。另外,请注意,某些磁带中的某些通道是完全扭曲的,在这种情况下,请使用其他通道。
欢呼,
Hooman

谢谢你的反馈。我尝试了重采样函数(也是不同的n),但从未接近论文中显示的值。

Hooman Sedghamiz

@AR谢谢你的评论。在代码中,根据采样频率的不同,滤波选项是不同的,但如果您使用200Hz采样频率的ECG,它将使用与Pan tompkins中描述的完全相同的滤波器进行处理。如果你有一个具有不同采样频率的信号,并且你不想使用其他滤波选项,另一个想法是使用matlab中的重采样函数,它可以将任何采样频率转换为200Hz,它使用FIR滤波器来做到这一点,但你的信号可能会失真,但你可以通过在重采样函数中选择更大的n来最小化这一点。点击这里阅读更多;

http://www.mathworks.de/de/help/signal/ref/resample.html

另一个建议是全部改变
轮(xyz * fs)

2 *轮(((xyz * fs) + 1) / 2) 1;
得到奇数个样本

在%%阈值和在线决策规则%%部分,您应该替换:

如果loc(我)轮(0.100 * fs) > = 1 & & loc (i) < =长度(ecg_h)

如果loc(我)轮(0.150 * fs) > = 1 & & loc (i) < =长度(ecg_h)

当使用来自PhysioNet的MIT-BIH心律失常数据库时(如Pan & Tompkins的论文中所提到的),你会得到不同的结果(比建议的更糟)。当然采样频率是不同的…

Hooman Sedghamiz

关于我在电子邮件中收到的一个问题;这个脚本能够处理所有不同的采样频率。这行代码“rem(fs,200)*fs/200”是为了确保如果你的采样频率高于200Hz并可分为200Hz,那么代码将你的信号采样到200Hz,例如,如果你的采样频率是400Hz或600Hz或1000hz,它会自动将其采样到200Hz,然后使用Pan tompkins算法中引入的原始滤波器,适用于200Hz的采样频率。如果你的采样频率不能被分为200hz,例如,如果它是360Hz,那么代码会使用另一种滤波选项,这是一个带通巴特沃斯滤波器,带通等于潘汤姆金斯纸上的滤波器,0.5- 15hz。因此,根据采样频率,滤波器的类型不同,但这是在代码中自动完成的,你不需要自己做。

Hooman Sedghamiz

想要更简单的峰值检测器,请查看我的其他R, S和T波检测器。
//www.tatmou.com/matlabcentral/fileexchange/45404-ecg-q-r-s-wave-online-detector

MATLAB版本兼容性
使用R2012b创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!