主要内容

dsp。FrequencyDomainFIRFilter

对输入信号进行频域滤波

描述

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

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

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

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

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

有关系统对象如何工作的详细信息,请参见什么是系统对象?

创建

描述

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函数。采样频率为8 kHz,滤波器的截止频率为2 kHz。脉冲响应的长度是400。

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

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

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

创建两个dsp。SineWave对象。产生的正弦波的采样率为8000hz,帧大小为256,频率分别为100hz和3khz。创建一个timescope对象查看筛选后的输出。

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

流媒体

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

numFrames = 1e4;idx = 1:numFrames x = sin_100Hz() + sin_3KHz() + 0.01*randn(frameLen,1);yOA = fdfOA(x);yOS = fdfOS(x);yFIR = fir(dly(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长度-长度(分子)+ 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个样品组成。

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

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

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

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

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

输出完全匹配。

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

初始化

设计FIR低通滤波器系数fir1函数。采样频率为8 kHz,滤波器的截止频率为2 kHz。时域脉冲响应的长度为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输出。

Fir = dsp。FIRFilter (“分子”、imp);Dly = dsp。延迟(“长度”, oa.Latency);

创建两个dsp。SineWave对象。产生的正弦波的采样率为8000hz,帧大小为256,频率分别为100hz和3khz。创建一个timescope对象查看筛选后的输出。

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

流媒体

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

numFrames = 1e4;idx = 1:numFrames x = sin_100Hz() + sin_3KHz() + 0.01 * randn(frameLen,1);Y1 = oa(x);Y2 = fir(dly(x));ts ((y1, y2));结束

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

算法

全部展开

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

参考文献

[1]小t.g.斯托克汉姆《高速卷积与相关》1966年春季联合计算机会议论文集Vol 28, 1966, pp. 229-233。

扩展功能

版本历史

在R2017b中引入