LMS 在 LabVIEW fpga(高吞吐量特性)中的实现

LMS implementation in LabVIEW fpga (High throughput personality)

不得不对 labVIEW FPGA 在阵列实现方面的局限性感到惊讶。我在 labview 方面经验不足,无法发表此评论,但我发现使用数组非常困难! 我正在从事主动降噪项目。我需要从两个麦克风以 40k 采样率和每帧 100 个样本(至少)收集音频数据,并通过扬声器以 40k 采样率输出音频。为此,我在 FPGA High throughput personality 中使用 myRIO 1900。

目前,我正在尝试在LabVIEW FPGA平台上实现LMS算法。我附上了下面的 MATLAB 代码,我想实现的是什么!

Till 数组初始化很好,但是当涉及到临时向量操作时。喜欢:

x_temp(1:nr_c-1)=x_temp(2:nr_c);
x_temp(nr_c)=x(i);

我要疯了!这该怎么做 ? LabVIEW 不允许我们正确索引一维数组(我们只能提取数组的一个特定元素而不是数组的一部分,我可以使用子数组函数提取 x_temp(1:nr_c) 但如何提取x_temp(2:nr_c) ??)

请帮助我如何使用上述基本语句对 'x_temp' 向量进行操作。

PS:1.LabVIEWFPGA只支持一维数组运算

  1. 尽管自适应滤波器工具包托盘在 myRIO FPGA High throughput personality 中可用,但我无法在 myRIO Target 上安装自适应滤波器工具包。!!!

    3.In MyLMS 程序:x:输入向量(数组),y:期望信号,nr_c:滤波器系数数,step:步长。我希望你能理解剩下的程序:)

MyLMS.m :

function [y_hat,e,w] = MyLms(step, nr_c, x, y)
%intializing all vectors
coeffs=zeros(1,nr_c);
x_temp=zeros(1,nr_c);
y_hat=zeros(length(x),1);
e=zeros(length(x),1);

for i=1:length(x)
  %temporary vector formation
  x_temp(1:nr_c-1)=x_temp(2:nr_c);
  x_temp(nr_c)=x(i);
  %LMS algorithm iterations
   y_hat(i) = x_temp * coeffs';      
  e(i)= y(i) - y_hat(i);       
  coeffs = coeffs+step*e(i)*x_temp;     
 end

我绝不是 LabVIEW FGPA 专家,但我认为您在 VHDL 中会遇到非常相似的限制。

无论如何,访问子数组的典型技术是using rotate and replace subset (see Joel_G's post). For more information about the FPGA constraints and capabilities, see the help document: Array Palette Details (FPGA Module)