未定义函数'fftOneSide'用于'double'类型的输入参数

时间:2016-02-11 11:09:32

标签: matlab

我正在使用MATLAB R2013。

fs=8000;
t=(1:512)'/fs; %'// <-- prevents string markdown
f=306.396;
original=sin(2*pi*f*t)+0.2*randn(length(t),1);
windowed=original.*hamming(length(t));
[mag1,phase1,freq1]=fftOneSide(original,fs);

错误:

  

未定义函数'fftOneSide'用于'double'类型的输入参数

1 个答案:

答案 0 :(得分:1)

这个问题是在之前的SO问题中提出的,到目前为止显然没有回应: error in using fftoneside

使用输入信号,不使用汉明功能(我的计算机上没有信号工具箱),定义下面的功能后(我在底部注释了演示代码,第一行注释了if nargin <1 obv !!),我在Matlab2015a上运行它。它跑得很好!设置plotOpt=1(使用三个参数调用,最终等于1)提供证据:

output from fftOneSide

我唯一能想到的是,在源代码中它要求输入一个文件 - 我假设你没有。如果您注释掉nargin <1部分以及最后的整个自我演示,请查看这是否无法正常工作。如果没有,我完全感到困惑!

我已经看了这个函数的源代码(下面),它也显示了正确的用法。正如您所看到的,他们正在从文件中读取信号和fs值,而不是像在此处一样定义它们。我们无法看到他们选择的价值,这有点痛苦。

请注意,调用要求指定plotOpt,但如果您没有指定,则开头的nargin调用应该为您设置为0(对吗?)。我认为自2012年以来默认函数声明没有改变 - 但如果它们有,那么用三个参数调用函数将会解决这个问题。注意:如果不设置plotOpt = 1,则图表将不会继续。

http://read.pudn.com/downloads99/sourcecode/others/404673/audioProcessing/fftOneSide.m__.htm

function [magSpec, phaseSpec, freq, powerSpecInDb]=fftOneSide(signal, fs, plotOpt) 
% fftOneSide: One-sided FFT for real signals 
%   Usage: [magSpec, phaseSpec, freq, powerSpecInDb]=fftOneSide(signal, fs) 
% 
%   For example: 
%       [y, fs]=wavread('welcome.wav'); 
%       frameSize=512; 
%       startIndex=2047; 
%       signal=y(startIndex:startIndex+frameSize+1); 
%       signal=signal.*hamming(length(signal)); 
%       plotOpt=1; 
%       [magSpec, phaseSpec, freq, powerSpecInDb]=fftOneSide(signal, fs, plotOpt); 

%   Roger Jang, 20060411, 20070506 

if nargin<1, selfdemo; return; end % MBio: comment out
if nargin<2, fs=1; end 
if nargin<3, plotOpt=0; end 

N = length(signal);         % Signal length 
freqStep = fs/N;            % Frequency resolution 
time = (0:N-1)/fs;          % Time vector 
z = fft(signal);            % Spectrum 
freq = freqStep*(0:N/2);        % Frequency vector 
z = z(1:length(freq));          % One side 
z(2:end-1)=2*z(2:end-1);        % Assuming N is even, symmetric data is multiplied by 2
magSpec=abs(z);             % Magnitude spectrum 
phaseSpec=unwrap(angle(z));     % Phase spectrum 
powerSpecInDb=20*log(magSpec+realmin);  % Power in db 

if plotOpt 
    % ====== Plot time-domain signals 
    subplot(3,1,1); 
    plot(time, signal, '.-'); 
    title(sprintf('Input signals (fs=%d)', fs)); 
    xlabel('Time (seconds)'); ylabel('Amplitude'); axis tight 
    % ====== Plot spectral power 
    subplot(3,1,2); 
    plot(freq, powerSpecInDb, '.-'); grid on 
    title('Power spectrum'); 
    xlabel('Frequency (Hz)'); ylabel('Power (db)'); axis tight 
    % ====== Plot phase 
    subplot(3,1,3); 
    plot(freq, phaseSpec, '.-'); grid on 
    title('Phase'); 
    xlabel('Frequency (Hz)'); ylabel('Phase (Radian)'); axis tight 
end 

% ====== Self demo MBio: comment ALL this code out! 
function selfdemo 
[y, fs]=wavread('welcome.wav'); 
frameSize=512; 
startIndex=2047; 
signal=y(startIndex:startIndex+frameSize+1); 
signal=signal.*hamming(length(signal)); 
[magSpec, phaseSpec, freq, powerSpecInDb]=feval(mfilename, signal, fs, 1);