主要内容

dsp。FrequencyDomainFIRFilter

对输入信号进行频域滤波

描述

dsp。FrequencyDomainFIRFilter系统对象™实现频域、快速傅立叶变换(FFT)为基础的滤波,以过滤流输入信号。在时域中,滤波操作涉及有限脉冲响应(FIR)滤波器的输入和脉冲响应之间的卷积。在频域,滤波操作包括输入的傅里叶变换和脉冲响应的傅里叶变换的乘积。当脉冲响应很长时,频域滤波是有效的。您可以通过设置直接在频域指定滤波系数NumeratorDomain“频率”

该对象使用重叠保存和重叠添加方法来执行频域滤波。对于具有长脉冲响应长度的滤波器,这两种方法固有的延迟可能是显著的。为了缓解这种延迟,dsp。FrequencyDomainFIRFilter对象将脉冲响应划分为更短的块,并在这些更短的块上实现重叠保存和重叠添加方法。为了分割脉冲响应,设置PartitionForReducedLatency财产真正的.有关这两种方法以及通过脉冲响应分区减少延迟的详细信息,请参见算法

在频域对输入信号进行滤波:

  1. 创建dsp。FrequencyDomainFIRFilter对象,并设置其属性。

  2. 使用参数调用对象,就像调用函数一样。

要了解更多关于System对象如何工作的信息,请参见什么是系统对象?

创建

描述

fdf= dsp。FrequencyDomainFIRFilter创建一个频域FIR滤波器系统对象,该对象使用重叠保存或重叠添加方法在频域内随时间独立地过滤输入信号的每个通道。

例子

fdf= dsp.FrequencyDomainFIRFilter (num)创建一个频域FIR滤波器对象分子属性设置为全国矿工工会

例子:dsp。FrequencyDomainFIRFilter(fir1(400,2 * 2000 / 8000));

例子

fdf= dsp。FrequencyDomainFIRFilter (名称,值创建一个频率域FIR滤波器系统对象,将每个指定的属性设置为指定的值。将每个属性名用单引号括起来。您可以将此语法与之前的任何输入参数组合一起使用。

例子:dsp.FrequencyDomainFIRFilter(“法”、“交叠相加”);

属性

全部展开

除非另有说明,属性是nontunable,这意味着您不能在调用对象之后更改它们的值。对象在调用时锁定,而释放函数打开它们。

如果一个属性是可调,您可以随时更改它的值。

有关更改属性值的更多信息,请参见在MATLAB中使用系统对象进行系统设计

频域滤波方法,指定为其中之一“Overlap-save”“交叠相加”.有关这两个方法的详细信息,请参见算法

滤波器系数的域,指定为:

  • “时间”——指定时域滤波器分子分子财产。

  • “频率”在中指定滤波器的频率响应FrequencyResponse财产。

FIR滤波器系数,指定为行向量。

可调:是的

依赖关系

此属性适用于以下情况NumeratorDomain被设置为“时间”

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64
复数的支持:金宝app是的

滤波器的频率响应,指定为行向量或矩阵。当PartitionForReducedLatencyFrequencyResponse必须是一个行向量。FFT的长度等于FrequencyResponse向量。当PartitionForReducedLatency真正的FrequencyResponse必须是2P——- - - - - -N矩阵,P分区大小,和N是分区数。

可调:是的

依赖关系

此属性适用于以下情况NumeratorDomain被设置为“频率”

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64
复数的支持:金宝app是的

时域分子长度,指定为一个正整数值标量。

依赖关系

此属性适用于以下情况NumeratorDomain被设置为“频率”PartitionForReducedLatency被设置为

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

标记来指定过滤器系数是否都是实数,指定为真正的

依赖关系

此属性适用于以下情况NumeratorDomain被设置为“频率”

标志分区分子以减少延迟,指定为如下之一:

  • ——过滤器使用传统的重叠保存或重叠添加方法。这种情况下的延迟是FFTLength长度(分子) + 1。

  • 真正的——在这种模式下,对象将分子分割成由PartitionLength财产。过滤器对每个分区执行重叠保存或重叠添加,并将部分结果组合成整体输出。延迟现在减少到分区长度。

FFT长度,指定为正整数。此属性的默认值为:[],表示FFT长度等于分子长度的两倍。FFT长度必须大于或等于分子长度。

例子:64

依赖关系

此属性在设置时应用NumeratorDomain财产“时间”PartitionForReducedLatency财产

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

分子分割长度,指定为小于或等于分子长度的正整数。

例子:40

例子:60

依赖关系

属性设置时将应用此属性NumeratorDomain财产“时间”PartitionForReducedLatency财产真正的

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

此属性是只读的。

过滤样本中的延迟,返回为大于0的整数。当PartitionForReducedLatency,则延迟等于FFTLength长度(分子) + 1。当PartitionForReducedLatency真正的时,延迟等于分区长度。

数据类型:uint32

使用

描述

例子

fdfOut= fdf(输入)对输入信号进行滤波,输出滤波后的信号。目标在频域内随时间独立地过滤输入信号的每个通道。

输入参数

全部展开

数据输入,指定为向量或矩阵。这个对象支持可变大小的输金宝app入信号。也就是说,即使在调用算法之后,您也可以更改输入帧的大小(行数)。但是,通道的数量(列的数量)必须保持不变。

例子:randn (164 4)

数据类型:|
复数的支持:金宝app是的

输出参数

全部展开

过滤后的输出,作为向量或矩阵返回。输出的大小、数据类型和复杂性与输入的匹配。

数据类型:|
复数的支持:金宝app是的

对象的功能

要使用对象函数,请指定System对象作为第一个输入参数。例如,释放名为system的对象的系统资源obj,使用下面的语法:

发行版(obj)

全部展开

fvtool 显示DSP滤波器的频率响应
一步 运行系统对象算法
释放 释放资源并允许更改系统对象属性值和输入特征
重置 使内部状态复位系统对象

例子

全部折叠

使用重叠加和重叠保存方法对输入信号进行滤波,并将输出与FIR滤波器的输出进行比较。

初始化

设计FIR低通滤波器系数fir1函数。采样频率为8khz,滤波器截止频率为2khz。脉冲响应的长度是400。

impL = 400;Fs = 8000;Fcutoff = 2000;小鬼= fir1 (impL 2 * Fcutoff / Fs);

创建两个dsp。FrequencyDomainFIRFilter对象和一个dsp。FIRFilter对象。设置所有三个过滤器的分子为小鬼.通过频域滤波器的延迟来延迟FIR输出。

fdfOA = dsp。FrequencyDomainFIRFilter (imp,“方法”“交叠相加”);fdfOS = dsp。FrequencyDomainFIRFilter (imp,“方法”“overlap-save”);冷杉= dsp。FIRFilter (“分子”、imp);海底= dsp。延迟(“长度”, fdfOA.Latency);

创建两个dsp。SineWave对象。生成的正弦波采样率为8000 Hz,帧大小为256,频率分别为100 Hz和3 kHz。创建一个timescope对象以查看过滤后的输出。

frameLen = 256;sin_100Hz = dsp。SineWave (“频率”, 100,“SampleRate”Fs,...“SamplesPerFrame”, frameLen);sin_3KHz = dsp。SineWave (“频率”3 e3,“SampleRate”Fs,...“SamplesPerFrame”, frameLen);ts = timescope (“TimeSpanOverrunAction”“滚动”...“ShowGrid”,真的,“TimeSpanSource”“属性”“时间间隔”, 5 * frameLen / Fs,...“YLimits”(-1.1 - 1.1),...“ShowLegend”,真的,...“SampleRate”Fs,...“ChannelNames”,{“交叠相加”“Overlap-save”“直接形式冷杉”});

流媒体

流1e4帧噪声输入数据。将这些数据通过频域滤波器和FIR滤波器。在时间范围内查看过滤后的输出。

numFrames = 1 e4;idx = 1:numFrames x = sin_100Hz() + sin_3KHz() + 0.01*randn(frameLen,1);yOA = fdfOA (x);老鞋整天唾沫横飞= fdfOS (x);yFIR =冷杉(海底(x));ts ([yOA,老鞋整天唾沫横飞,yFIR]);结束

这三个过滤器的输出完全匹配。

对频域FIR滤波器的脉冲响应长度进行分割。比较分割后的滤波器和原始滤波器的输出。

设计FIR低通滤波器系数fir1函数。采样频率为8 kHz,滤波器截止频率为2 kHz。脉冲响应的长度是4000。

impL = 4000;Fs = 8000;Fcutoff = 2000;imp = fir1(impL,2 * Fcutoff / Fs);

创建一个dsp。FrequencyDomainFIRFilter系数设为小鬼向量。这个过滤器的延迟是$FFT Length - Length(分子)+ 1等于4002。默认情况下,FFT长度等于分子长度的两倍。这使得延迟与脉冲响应长度成正比。

fdfOS = dsp。FrequencyDomainFIRFilter (imp,“方法”“overlap-save”);流(“频域滤波器延迟为%d采样\n”, fdfOS.Latency);
频域滤波器延迟为4002个样本

将脉冲响应划分为长度为256的块。分区后的延迟时间与块长度成正比。

fdfRL = dsp。FrequencyDomainFIRFilter (imp,“方法”“overlap-save”...“PartitionForReducedLatency”,真的,...“PartitionLength”, 256);流(“频域滤波器延迟为%d采样\n”, fdfRL.Latency);
频域滤波器延迟为256个样本

比较两个频域滤波器的输出。的延迟fdfOS是4002,时延是fdfRL是256。为了比较两个输出,将输入延迟到fdfRL到4002 - 256个样本。

海底= dsp。延迟(“长度”(fdfOS.Latency-fdfRL.Latency));

创建两个dsp。SineWave对象。正弦波的采样率为8000 Hz,帧大小为256,频率分别为100 Hz和3 kHz。创建一个timescope对象以查看过滤后的输出。

frameLen = 256;sin_100Hz = dsp。SineWave (“频率”, 100,“SampleRate”Fs,...“SamplesPerFrame”, frameLen);sin_3KHz = dsp。SineWave (“频率”3 e3,“SampleRate”Fs,...“SamplesPerFrame”, frameLen);ts = timescope (“TimeSpanOverrunAction”“滚动”“ShowGrid”,真的,...“TimeSpanSource”“属性”“时间间隔”, 5 * frameLen / Fs,...“YLimits”(-1.1 - 1.1),...“ShowLegend”,真的,...“SampleRate”Fs,...“ChannelNames”,{“Overlap-save与分区”“Overlap-save没有分区”});

流1e4帧噪声输入数据。将这些数据通过两个频域滤波器。在时间范围内查看过滤后的输出。

numFrames = 1 e4;idx = 1:numFrames x = sin_100Hz() + sin_3KHz() + 1 * randn(frameLen,1);yRL = fdfRL(海底(x));老鞋整天唾沫横飞= fdfOS (x);ts ([yRL,老鞋整天唾沫横飞]);结束

输出完全匹配。

在频域中指定频域FIR滤波器的分子系数。用重叠加法对输入信号进行滤波。比较频域FIR滤波器输出和相应的时域FIR滤波器输出。

初始化

设计FIR低通滤波器系数fir1函数。采样频率为8khz,滤波器截止频率为2khz。时域脉冲响应的长度为400。计算这个脉冲响应的FFT,并将这个响应指定为频域FIR滤波器的频率响应。设置时域分子长度,由NumeratorLength性质,为时域脉冲响应中元素的个数。

impL = 400;Fs = 8000;Fcutoff = 2000;imp = fir1(impL,2 * Fcutoff / Fs);H = fft(imp, 2 * numel(imp));oa = dsp。FrequencyDomainFIRFilter (“NumeratorDomain”“频率”...“FrequencyResponse”H,...“NumeratorLength”元素个数(imp),...“方法”“交叠相加”);流(“频域滤波器延迟为%d采样\n”, oa.Latency);
频域滤波器延迟为402个样本

创建一个dsp。FIRFilter系统对象?并指定分子作为时域系数计算fir1函数,小鬼.通过频域FIR滤波器的延迟来延迟FIR输出。

冷杉= dsp。FIRFilter (“分子”、imp);海底= dsp。延迟(“长度”, oa.Latency);

创建两个dsp。SineWave对象。生成的正弦波采样率为8000 Hz,帧大小为256,频率分别为100 Hz和3 kHz。创建一个timescope对象以查看过滤后的输出。

frameLen = 256;sin_100Hz = dsp。SineWave (“频率”, 100,“SampleRate”Fs,...“SamplesPerFrame”, frameLen);sin_3KHz = dsp。SineWave (“频率”3 e3,“SampleRate”Fs,...“SamplesPerFrame”, frameLen);ts = timescope (“TimeSpanOverrunAction”“滚动”...“ShowGrid”,真的,“YLimits”(-1.1 - 1.1),...“TimeSpanSource”“属性”“时间间隔”, 5 * frameLen / Fs,...“ShowLegend”,真的,...“SampleRate”Fs,...“ChannelNames”,{“交叠相加”“直接形式冷杉”});

流媒体

流1e4帧噪声输入数据。将这些数据通过频域FIR滤波器和时域FIR滤波器。在时间范围内查看过滤后的输出。

numFrames = 1 e4;idx = 1:numFrames x = sin_100Hz() + sin_3KHz() + 0.01 * randn(frameLen,1);日元= oa (x);y2 =冷杉(海底(x));ts ((y1, y2));结束

两个过滤器的输出完全匹配。

算法

全部展开

重叠保存和重叠添加是该算法使用的两种基于频域fft的滤波方法。

参考文献

小t·G·斯托克汉姆“高速卷积和相关。”1966年春季联合计算机会议论文集,1966年第28卷,229-233页。

扩展功能

介绍了R2017b