[英]Using interpolation and repmat to change frequency of signal in octave and matlab
我正在使用像Matlab一樣的Octave 3.8.1,我試圖使用內插和repmat來改變信號的頻率( 因為這樣做是如此之快(.01秒),我必須在28000以上創建)一次 ) 我可以將變量num_per_sec更改為任何整數,但是如果嘗試將其更改為2.1或帶小數的任何內容,則會收到錯誤消息 “錯誤:重塑:無法將44100x2數組重塑為92610x1數組錯誤:稱為來自:第10行(repmat行)”,有人針對此建議或其他建議有解決方法嗎?
注意:請注意, ya是一個簡單的測試方程式, 我沒有方程式可以與僅適用於信號的方程式一起使用,因此僅更改freq變量將不起作用。
參見下面的代碼:
clear,clc
fs = 44100; % Sampling frequency
t=linspace(0,2*pi,fs);
freq=1;
ya = sin(freq*t)'; %please note that this is a simple test equation I won't have equations just the signal to work with.
num_per_sec=2 %works
%num_per_sec=2.1 %doesn't work
yb=repmat(ya,num_per_sec,1);%replicate matrix
xxo=linspace(0,1,length(yb))'; %go from 0 to 1 sec can change speed by incr/decr 1
xxi=linspace(0,1,length(ya))'; %go from 0 to 1 sec and get total samplerate from total y value
yi_t=interp1(xxo,yb,xxi,'linear');
plot(yi_t)
您正在嘗試使用浮點數調用repmat
。 顯然,它不會按照您的預期工作。 repmat
的預期操作是將特定維度復制整數次 。
因此,我可以建議的一件事是將信號截斷為不大於1的倍數,並將其堆疊在復制信號的末尾。 例如,如果要復制信號2.4次,則通常將整個信號復制兩次,然后將信號長度的40%堆疊到數組的末尾。 因此,您最多采樣信號總持續時間的40%,並將其放置在復制信號的末尾。
由於您具有采樣頻率,因此可以告訴您信號應包含每秒多少個采樣 。 這樣,找出您有多少個整數倍,然后通過將該百分比的底數乘以您的采樣頻率來確定部分信號包含多少個采樣。 然后,您可以從中進行采樣並將其堆疊在信號末尾。 例如,以2.4的示例為例,我們將執行floor(0.4*fs)
以確定從信號開始處需要提取的樣本總數,以將其放置在復制信號的末端。
像這樣:
%// Your code
clear, clc
fs = 44100; %// Define sampling frequency
t=linspace(0,2*pi,fs);
freq=1;
ya = sin(freq*t)'; %// Define signal
num_per_sec=2.1; %// Define total number of times we see the signal
%// New code
%// Get total number of integer times we see the signal
num_whole = floor(num_per_sec);
%// Replicate signal
yb=repmat(ya,num_whole,1);
%// Determine how many samples the partial signal consists of
portion = floor((num_per_sec - num_whole)*fs);
%// Sample from the original signal and stack this on top of replicated signal
yb = [yb; ya(1:portion)];
%// Your code
xxo=linspace(0,1,length(yb))';
xxi=linspace(0,1,length(ya))';
yi_t=interp1(xxo,yb,xxi,'linear');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.