Error in resampling function

16 ビュー (過去 30 日間)
Alexandra Dunning
Alexandra Dunning 2023 年 2 月 7 日
コメント済み: Alexandra Dunning 2023 年 2 月 7 日
Hi I am still new to MATLAB but have been instructed to upsample some torque data using a function:
function res_signal_out = resample_zeroshift(res_signal_in, length_resample)
% Zero the signal start
tmp_signal = res_signal_in - res_signal_in(1);
% Flip and append so that signal ends at zero
tmp_signal = [tmp_signal; flipud(tmp_signal)];
% Resample linearly
res_tmp_signal = resample(tmp_signal, length_resample*2, length(tmp_signal));
% Take first half of resampled signal and add offset that was removed
res_signal_out = res_tmp_signal(1:length_resample) + res_signal_in(1);
end
I am calling the function with the script:
clear; clc;
% import data file
textTable = readtable(fullfile(pwd,'Torque08forResampling.TXT'));
% convert data to array
textArray = table2array(textTable);
% iterate through the 7 columns of data in the file and resample using function resample_zeroshift
for i = 1:width(textArray)
textResults(:,i) = resample_zeroshift(textArray(:,i),93001);
end
This function works for a torque file that has only 2993 rows of data, being upsampled to 6000... however when I use the same code for a torque file which is 46517 rows long, upsampling to 93001, the error that I am getting is:
Error using upfirdn>validateinput (line 129)
The product of the downsample factor Q and the upsample factor P must be less than 2^31.
Error in upfirdn (line 81)
[p,q] = validateinput(x,h,varargin);
Error in resample>uniformResample (line 478)
yVec = upfirdn(x,h,p,q);
Error in resample (line 217)
uniformResample(xIn, isDimValSet, Dim, dimIn, numericArgs{:});
Error in resample_zeroshift (line 7)
res_tmp_signal = resample(tmp_signal, length_resample*2, length(tmp_signal));
Would appreciate any help!!
Thanks
PS I am using MATLAB R2021a

採用された回答

Joel Bottin-Noonan
Joel Bottin-Noonan 2023 年 2 月 7 日
編集済み: Joel Bottin-Noonan 2023 年 2 月 7 日
Hi Alexandra,
The resample function doesnt allow p*q to be > 2^31 = 2147483648. Because of the error message from the function upfirdn not allowing p*q to be > intmax('int32').
In the resample function it seems you have assigned your p value to be to be double the length of length_resample = 93001*2 = 186002. And your q value to be length(tmp_signal) = 46517*2 (due to the flip and concatenation) = 93034. Therefore your p*q = 17304510068.
My first guess would have been to simplify the fraction of p and q by halving the denominator and numerator.BUT in its simplest form p/q = (186002/2)/(93034/2) = 93001/46517. Giving your p*q = 4326127517 > 2^31.Unfortunately you cant fix this with a decimal point either as p and q are required to be poistive integers.
There are 2 options in my opinion.
1. You could estimate the value of upsample ratio p/q to be 2. Therefore making p = 2 and q = 1.(You can choose a more accurate ratio if you'd like as long as p*q is not > 2^31.)
2.If accuracy of the sampling time is a big issue, cut your data into smaller arrays and resample.
Kind Regards!
  1 件のコメント
Alexandra Dunning
Alexandra Dunning 2023 年 2 月 7 日
Thanks so much, great answer!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeMultirate Signal Processing についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by