C语言编写的MEX程序入门指南

版权申诉
5星 · 超过95%的资源 2 下载量 81 浏览量 更新于2024-10-21 1 收藏 127KB RAR 举报
资源摘要信息:"mex.rar_C MEX_C MEX S-Function_C MEX-file _C语言mex_mex" 从给定的信息中,我们可以了解到该压缩包文件"mex.rar"涉及的内容主要集中在C语言编写的MEX程序。MEX(MATLAB Executable)程序是一种特殊的文件类型,允许用户在MATLAB环境中调用C、C++或其他支持的语言编写的函数。MATLAB作为一种高效的技术计算语言广泛应用于工程和科学领域,而MEX程序为MATLAB提供了一种与底层语言交互的高效方式,扩展了MATLAB的功能。下面将详细解析与该MEX程序相关的知识点: 1. C MEX C MEX是用C语言编写的MEX程序的简称。MEX程序是一个动态链接库(DLL),可以通过MATLAB的mex命令进行编译。MEX文件通常用于提高数值计算的效率,或者实现MATLAB本身尚未内置的算法。编写C MEX程序需要熟悉C语言编程以及MATLAB的MEX API。 2. C MEX S-Function S-Function(系统函数)是MATLAB中Simulink模型的一个模块,可以用来表示复杂的系统或者定制的功能。在C MEX S-Function中,开发者可以使用C语言来实现Simulink无法直接表示的动态行为。S-Function为用户提供了极大的灵活性,但它要求开发者对C语言和MATLAB的Simulink环境都有较深的理解。 3. C MEX-file C MEX-file指的是在MATLAB中可以调用的C语言编写的MEX程序文件。这些文件通常具有".mexw64"(64位Windows系统)或".mexa64"(64位Mac系统)这样的扩展名,表明它们是动态链接库文件。编写C MEX-file需要开发者掌握C语言编程,MATLAB C API,以及对MATLAB数据类型的理解。 4. C语言mex程序 使用C语言编写的mex程序允许用户在MATLAB环境中直接运行C编写的代码,提供了一种将C语言的性能优势和MATLAB的高级数值计算能力结合在一起的方法。一个标准的C语言mex程序文件由一个名为"mexFunction"的函数组成,该函数有四个标准参数:输入参数数量、输出参数数量、指向输入数据的指针数组以及指向输出数据的指针数组。此外,编写C语言mex程序需要具备良好的内存管理意识,因为MATLAB对动态内存的处理与C语言有所区别。 5. 编程和资源 该资源提到包含有PDF文档和源代码,这对初学者来说是非常有价值的。PDF文档可能提供了有关如何使用和编写C MEX程序的理论知识和示例,而源代码则提供了一个实际应用这些理论的实例。这有助于初学者理解和掌握MEX程序的构建过程,以及如何将C语言与MATLAB集成。 6. 标签说明 标签"cMex"、"cMex_s-function"、"cMex-file"和"c语言mex"进一步指明了该资源的内容范围,帮助用户快速定位和识别这些MEX程序相关的资源。 综上所述,"mex.rar"资源包是一个非常有价值的工具,特别是对那些希望扩展MATLAB功能或提高计算效率的开发者来说。该资源包含理论知识和实际示例,可以帮助初学者快速入门C MEX程序的编写,并深入理解其背后的原理和应用。

function [pesq_mos, pesq_seg] = pesq(ref, deg, fs) % Check inputs if nargin < 3 fs = 16000; end if nargin < 2 error('Not enough input arguments'); end if length(ref) ~= length(deg) error('Input signals must be of equal length'); end % Load filter coefficients load('pesq_filter.mat'); % High-pass filter deg_hp = filter(b_hp, a_hp, deg); % Remove silence [r_beg, r_end] = find_voiced(ref, fs); [d_beg, d_end] = find_voiced(deg_hp, fs); r_sig = ref(r_beg:r_end); d_sig = deg_hp(d_beg:d_end); % Find maximum length sig_len = min(length(r_sig), length(d_sig)); % Filter signals r_sig = filter(b_lpf, a_lpf, r_sig(1:sig_len)); d_sig = filter(b_lpf, a_lpf, d_sig(1:sig_len)); % Resample signals r_sig = resample(r_sig, 8000, fs); d_sig = resample(d_sig, 8000, fs); % Calculate PESQ [pesq_mos, pesq_seg] = pesq_mex(r_sig, d_sig); end function [beg, endd] = find_voiced(sig, fs) % Set parameters win_len = 240; win_shift = 80; sil_thresh = 30; min_voiced = 0.1; % Calculate energy sig_pow = sig.^2; sig_pow_filt = filter(ones(1, win_len)/win_len, 1, sig_pow); % Normalize sig_pow_filt = sig_pow_filt/max(sig_pow_filt); % Find voiced segments beg = []; endd = []; num_voiced = 0; for n = 1:win_shift:length(sig)-win_len if sig_pow_filt(n+win_len/2) > min_voiced && ... mean(sig_pow_filt(n:n+win_len-1)) > sil_thresh if isempty(beg) beg = n; end else if ~isempty(beg) endd = [endd n-1]; num_voiced = num_voiced + 1; beg = []; end end end if ~isempty(beg) endd = [endd length(sig)]; num_voiced = num_voiced + 1; end % Remove segments that are too short min_len = fs*0.05; len_voiced = endd-beg+1; too_short = len_voiced < min_len; beg(too_short) = []; endd(too_short) = []; end这段代码中的pesq_mex.mex64文件怎么编译

2023-05-11 上传