程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Matlab 谱图函数的手动实现大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Matlab 谱图函数的手动实现?

开发过程中遇到Matlab 谱图函数的手动实现的问题如何解决?下面主要结合日常开发的经验,给出你关于Matlab 谱图函数的手动实现的解决方法建议,希望对你解决Matlab 谱图函数的手动实现有所启发或帮助;

我正在尝试实现我自己的函数,该函数给出与 Matlab 谱图函数相同的结果。 到目前为止,我已经完成了这样的功能:

function out = manulaSpectogram(x,win,noverlap,nfft)
x = x(:);
n = length(X);
wlen = length(win);
nUnique = ceil((1+nfft)/2); % number of uniqure points
L = fix((n-noverlap)/(wlen-noverlap)); % number of signal frames
out = zeros(L,nUniquE);
index = 1:wlen;
    for i = 0:L-1
        xw = win.*x(indeX);
        X = fft(xw,nfft);
        out(i+1,:) = X(1:nUniquE);
        index = index + (wlen - noverlap);
    end
end

在我的测试中,当参数 nfft 大于或等于窗口长度时,它可以完美运行并给出与光谱图函数相同的结果。

% first test (nnft = window length):
A = [1,2,3,4,5,6];
window = 6;
overlap = 2;
nfft = 6;
s = spectrogram(A,hAMMing(window),overlap,nfft)'
s2 = manulaSpectogram(A,nfft)
% results:
s =
   9.7300 + 0.0000i  -5.2936 + 0.9205i   0.7279 - 0.3737i  -0.1186 + 0.0000i
s2 =
   9.7300 + 0.0000i  -5.2936 - 0.9205i   0.7279 + 0.3737i  -0.1186 + 0.0000i
   
% second test (nfft > window length):
A = [1,6];
window = 3;
overlap = 2;
nfft = 6;
s = spectrogram(A,nfft)
% results:
s =
   2.3200 + 0.0000i   0.9600 + 1.9399i  -1.0400 + 1.5242i  -1.6800 + 0.0000i
   3.4800 + 0.0000i   1.5000 + 2.8752i  -1.5000 + 2.3209i  -2.5200 + 0.0000i
   4.6400 + 0.0000i   2.0400 + 3.8105i  -1.9600 + 3.1177i  -3.3600 + 0.0000i
   5.8000 + 0.0000i   2.5800 + 4.7458i  -2.4200 + 3.9144i  -4.2000 + 0.0000i
   
s2 =
   2.3200 + 0.0000i   0.9600 - 1.9399i  -1.0400 - 1.5242i  -1.6800 + 0.0000i
   3.4800 + 0.0000i   1.5000 - 2.8752i  -1.5000 - 2.3209i  -2.5200 + 0.0000i
   4.6400 + 0.0000i   2.0400 - 3.8105i  -1.9600 - 3.1177i  -3.3600 + 0.0000i
   5.8000 + 0.0000i   2.5800 - 4.7458i  -2.4200 - 3.9144i  -4.2000 + 0.0000i

如果窗口长度小于nfft,则结果不同。

% third test (nfft < window length):
A = [1,6];
window = 6;
overlap = 2;
nfft = 3;
s = spectrogram(A,nfft)
% results:
s =
   9.7300 + 0.0000i   0.7279 - 0.3737i
 
s2 =
   3.6121 + 0.0000i  -1.6861 + 1.6807i

那么,即使在 nnft 小于窗口长度的情况下,我该如何改进我的函数以接收相同的结果? Matlab 的谱图如何计算这种情况?

我正在尝试实现我自己的函数,因为谱图函数是我需要从 Matlab 到 C# 语言实现的大型算法的一部分,所以我想知道谱图“黑匣子”的作用..

解决方法

我注意到当窗口大小大于 nfft 标量数时,必须以某种方式转换数据。最后我找到了一个内部的 Matlab 函数,它可能在原始 spectogram Matlab 函数中被调用。它被命名为 datawrap 并以 nfft 为模包装输入数据。

因此,在我的函数中,我必须在调用 fft 之前转换数据段(与 datawrap 函数的操作方式相同)。 改进的功能:

function out = manulaSpectogram(x,win,noverlap,nfft)
x = x(:);
n = length(X);
wlen = length(win);
nUnique = ceil((1+nfft)/2); % number of uniqure points
L = fix((n-noverlap)/(wlen-noverlap)); % number of signal frames
out = zeros(L,nUniquE);
index = 1:wlen;
    for i = 0:L-1
        xw = win.*x(indeX);
        % added transformation
        if length(xw) > nfft
            xw = sum(buffer(xw,nfft),2);
        end
        % end of added transformation
        X = fft(xw,nfft);
        out(i+1,:) = X(1:nUniquE);
        index = index + (wlen - noverlap);
    end
end

我相信它可以正常工作,因为它给出的结果与 Matlab spectogram 函数相同。

大佬总结

以上是大佬教程为你收集整理的Matlab 谱图函数的手动实现全部内容,希望文章能够帮你解决Matlab 谱图函数的手动实现所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: