Author Archives: Andrew

About Andrew

Rheologist

在MATLAB做Fourier变换的相关代码

每次遇到Fourier变换都忘记的基本代码。

如何获得“右半边”的Fourier变换谱?

所谓“右半边”的Fourier变换谱其实就是频率大于零那半边。对FFT来说其实是截取“左半边”。


function [X,freq]=lhsFFT(x,Fs)
% Cuts the left-hand side of FFT
% x is the signal sample to be FTT-ed, Fs is the sampling frequency of the signal
% X is the FFT result, freq is the frequency axis

N = length(x);

freq_bin = 0:N-1; % the frequency bin
freq_res = Fs / N; % the frequency resolution
freq = freq_bin * freq_res; %create the frequency range
X = 2 * fft(x) / N; % normalize the data
cutoff = ceil(N/2); %length of the left-hand side

freq = freq(1:cutOff);
X = X(1:cutOff);

获取某频率的幅值

问题其实就是决定某频率值落在第几个frequency bin,然后四舍五入取最接近的那个频率。


N = length(x);

freq_Res = Fs / N; % the frequency resolution
[X, freq] = lhsFFT(x, Fs) % get the left-hand side FFT

f = 1.234 % The queried frequency is 1.234 Hz for example

freq_bin_prime = round(f/freq_res); % finds the frequency bin closest to f
freq_prime = freq_bin * freq_res; % the resolved frequency closest to f
X_prime = X(freq_bin_prime + 1); % the amplitude of the resolved frequency (vector index starts from 1)

TA新流变仪产品系列Discovery Hybrid Rheometers

后知后觉的我到今天才知道TA出了新的流变仪,缩写叫DHR。从架构上看应该是一台应力控制型流变仪。于是AR系列要拜拜了?

使用AR-G2让我有三点不爽:

  1. 基本无效的惯量较正。我没有遇到任何一种情况下动态扫频能做到ω > 70 rad/s
  2. 各种阶跃测试控制量达到稳态的时间太长,而且有怪现象。尤其是应变控制。例如做阶跃应变速率的时候,应变速率值稳定一会儿之后总是要出一个小峰再继续真正地维持稳定。这个小峰不是信号,是真的应变速率,因为导致测得的应力也出个小峰了。
  3. 不能获得原始波型,做不了LAOS(哪怕是应力控制型的LAOS)

其实第一个情况,对于低粘度样品基至做不到ω > 10 rad/s。这样的话,你力矩测下限就算做到pN⋅m级也没用。

于是DHR的Brochure我看得最仔细的是关于它的Motor。这次说是换了Drag Cup Motor,具体是啥我也没时间细查。从Brochure所吹嘘的情况来看,应该是从源头减小了惯量(而不是像安东帕那样通过优化惯量校正算法)。

然后Brochure里还突然加一条“Purer information for LAOS measurements”,不知道到底是解决了啥。以前的LAOS怎么impure法了。其实用应力控制型流变仪做应变控制LAOS有个问题就是反馈回路是否利用了线性粘弹性的前提。这个其实也不成问题,因为我完全可以改做应力控制的LAOS,获得高次谐波柔量而不是模量。真正的问题在于用户能否取模拟信号自己干。AR系列是不行的。而且TA应该通过ARES系列尝到了保留模拟输出的甜头。由于这东西的存在多少研究小组帮TA做了新东西(不仅仅是LAOS),保住了应变控制流变仪的新鲜度。相反AR系列由于没有往这个方向走的可能,反而让安东帕等在易用性上做文章超过了。

测量正弦信号的频率为什么要用sine wave fitting代替FFT?

理由一:做FFT需要实现coherent sampling,实现coherent sampling需要事先精确获得信号实际频率。用FFT测频率是循环论证自食其果。

理由二:就算通过手动(肉眼定位)来确保coherent sampling,FFT还受bin的限制。假如频率分辨率不高,FFT给出的频率仅仅是最相近的bin的值。一般这个是通过zero padding解决,但是LAOS实验由于其他原因,不能做zero padding。

另:为什么不用zero crossing方法?因为这个方法对噪音非常敏感。本来只有一处zero crossing的,由于噪音会在附近出现N多处。

sine wave fitting的问题在于,如果频率作为parameter的话,这个函数是没办法线性化的。因此只能做iteration。经验表明,fitting的成功率非常依赖于你给的频率初始值。最好要让频率初始值尽可能的接近真实值,否则会收敛不了。所以做sine wave fitting之前仍然有必要采用其他方法对信号频率进行初估。FFT在此派上用场,但不是唯一的办法。

这里有一个相关讨论。

一个现成的软件在此。该软件包含对IEEE标准的几个简单和十分有益具体化,值得重点参考。MatlabCentral上还有一个现成代码可供试用。