2021年4月19日 (月)

アンテナ調整ーその1

どうもヨーロッパに開けていかないので試行錯誤調整。

14/28と21を単一バランにまとめたことが問題じゃないかなぁ、って思いながらも取り合えずアンテナ構成の変更を試してみた。

アンテナはバラン中心に北側が西側から14/28、21、50で張っていた。この構成では14/28が10時方向になり、21が12時方向、50が2時方向となっていた。14/28と21を入れかえるとどうなるか等の実験をした。

変更作業内容

Photo_20210419092601

変更前の状態
24h

結果はとても残念なものだった。北米が全く入らなくなった。

変更後の状態
12h

なんでだろう。理由は定かでないけれども東側からの電波に対する感度が極端に落ちた。

そもそも単一バランにする前14/28の最初のQSOはポルトガルだったわけで、ヨーロッパが良く聞こえていた。ということは単一に戻せば状態が復帰するかもしれない。で、14/28単一にしておよそ11時方向に張った。

単一の状態
14m

NAの感度が良くなった。内陸側からも聞こえている。明らかに状況が違う。やっぱりバランおまとめは難があるのだろうか。

とりあえずヨーロッパがどの程度聞こえるようになるか暫く様子を見てみることにする。

2021年4月17日 (土)

WordPress Lightbox機能

以前悩んで上手く構成できなかったLightbox機能(イメージをクリックすると拡大される機能)の設定の仕方がやっと分かったので備忘録。

まず、ページに画像を張り付ける方法は編集方法によって以下のとおり。

ブロック編集

この場合はギャラリーで画像を張り付けること。そうするとリンク先選択が出てくる。ここでリンク先をメディアリンクにする。画像で張り付けるとリンク先選択が出てこないの要注意。

クラッシック編集

この場合はメディアの追加で画像をはりつけること。そうするとリンク先選択がでてくる。

LightboxはResponsible Lightbox & Galleryを使うこととする。設定はDefaultのままでOK。ただし、Cocoonも画像拡大機能がDefaultでONになっているので、画像拡大が2パターン実行されてしまう。この為、Cocoon側の設定をOFFにする。この選択画面は画像タブにある。

Cocoon

これで画像拡大が使えるようになった。めでたし、めでたし。

2021年4月15日 (木)

マルチバンド・ダイポールアンテナ構成

現時点でのマルチバンド・ダイポールアンテナ構成は以下のとおり。

  • 14MHz/28MHz
  • 21MHz
  • 50MHz

合計3本のダイポールアンテナを単一のバランで構成している。写真左側の奥から50M、21M、14/28M。

Img01021

各アンテナはおよそ30度のアングルを設定している。いずれのアンテナの素のSWRは1.5程度で、FT450内蔵アンテナチューナーを使って1.1程度まで落としてある。当初は50Mだけ逆Vにしてみたけれど、SWRが2.5位から下がらなかったため、この構成に落ち着いてる。

たまたま今時点ではそう見えているのかもしれないけれど、当初14/28と21のダイポールを別バランで構成し、それぞれをほぼ平行に張っていた時は、14がもっとヨーロッパに開けていたような印象をもっているけれど、まとめてからはちょっと閉じている感じ。加えてNA東海岸にも開けていない。要調査。

 

 

2021年4月14日 (水)

CLUB LOGへの登録

Club Logへの登録も行ったので、その記録。

Club Logへはアカウント情報としてメールアドレスとパスワードの設定でOK。ただし、そのメールアドレスにActivation Codeが送られてくるので、そのCodeを使ってそのアカウントを活性化する。

Club Logの使い方は別途。

アマチュア無線の世界ではデジタル化されたログが全てといった感じ。Logger32のeQSLやLoTW連携も身に付けると良さそう。

QRZ.comへの登録

QRZ.comへの登録も行ったのでその記録。

その昔コールサインブックなる分厚い電話帳のような書籍が発行されていた。更新相手の所在地やQSLをダイレクトメールする場合にそこに記載されているアドレスを参照していた。今は個人情報保護からそのようなブックが発行されることはない。で、代わりの方法は何か?ということで提供されているのがQRZ.comになるわけだ。

QRZ.comのアカウントは簡単に作成できる。Registrationするだけ。でも、自分のアドレス等を登録することはできない。まずは、DB上に自分のエントリーを作成してもらうべく、管理者に依頼する必要がある。手段はメールになる。具体的な方法はForumのFAQに書かれている。

具体的な方法のURL

以下の情報をメールに記載してメールで登録依頼を送る。

MANDATORY
Callsign:
First Name + Middle initial:
Last Name:
Address Line 2: (City/Town etc)
Country:


OPTIONAL
Plus any other information you want:
Address Line 1: (Street etc)
Zip/Post Code:
Grid Square: (or Latitude & Longitude)
Previous Callsign(s):
CQ Zone:
ITU Zone:
IOTA Ref. Number: (AS-007 etc)
IOTA Group Name: (Honshu Island etc)
QSL Info:
Public Email:
Birth Year:
Show Birth Year on page?: Yes/No
eQSL?: Yes/No
LOTW?: Yes/No
Mail QSL?: Yes/No

今回の場合、12時間以内にメール返信が届いた。で、依頼した内容がDBに登録されている(Searchすれば出てくる)ことが確認できた。

この登録内容は、自分で編集ができる。このことは自分の検索結果のDetail -> QRZ Admin が自分のコールサインになっていることで確認できる。編集は、メニューバーの自分のコールサインのEdit、、、、から行える。

これで一応この世界にデビューできたことになる。

2021年4月13日 (火)

eQSL/LoTWの準備

それなりのレベルの運用を始めるためにeQSLとLoTWの準備を行ったので備忘録。

eQSL

基本的にeQSLは登録さえすれば無料でeQSL交換が始められる。無料であればQSLカードデザインは既定のテンプレートの中から選ぶことになるがQSLカードとしての体裁は整う。WSJT-Xが出力したADIファイルをアップロードすると自動的にeQSLカードがeQSL登録局に自動的に送られる。カードを送った先はOutboxで確認できる。これとは逆に受け取ったカードはInboxで確認できる。

無料で誰でも登録できる分、偽物も居ることが前提となる。その為真正性確認のオプションが用意されている。Authenticity Guaranteedオプションがそれで、自分の局免許のスキャンデータ(写真でも良い)をUploadすることで申請できる。自分の場合は翌日に承認の通知メールが届いた。これでPSKReporterで見ると自分の局ポイントに毛が生えたように見えているはずだ。

なお、Authenticity GuranteedページでView your AG certificateをクリックすると認証証書を見ることができる。ここには自分の局免許を確認した人(チェックした人)の名前とコールサインが書かれている。

LoTW

これはDXCCなどでのログ認証の為に必要となる。立派なガイドが用意されているので沿って作業すれば良い。ここでは局免許に加えて、公的な身分証明書(自分の場合は運転免許)のスキャンファイルをメール添付文書として送っている。返事が返ってくるのに3日程かかった(週末も入っていたから本当はもっと早いのかも)。局免許の名前と住所が一致することがチェック対象じゃないかと思う。返事メールには証明書ファイルが添付されていて、これをダブルクリックすることでTQSLアプリに証明書が登録された。返事メールにはユーザー名とパスワードが書かれているので、そのアカウント情報でLoTWにログインできる。

自分は神奈川分と長野分の2ロケーション分のログがあるので、それぞれのロケーションを登録した。ADIファイルもロケーションに合わせて分離した。この2ファイルをアップロードした。ファイルのアップロードはTQSLアプリケーションから実行する。「ログに署名し、LoTWに自動的ににアップロード」を選択し、ADIファイルを証明書によって署名してログをアップロードするとLoTWのDBに展開される。

Tqsl

Home画面は以下の通り。

Lotwawards

TQSLによってDBにログを展開した後、Home画面でSelect DXCC Award Accountをクリックすると以下の画面になる。

Lotwdxccsummary 

この画面のAccount Creditsをクリックすると通信したCountryがコンタクト局名と並んでリストされる。

この一連の流れからすると、ログを手入力してアップすることでCountryを登録することも出来る。

まとめ

以上でeQSLとLoTWが使えるようになった。いずれも入力ファイルはWSJT-Xのログファイルとなるわけだ。

2021年3月21日 (日)

台湾YUASAのバッテリーをオーダー

丁度3年前、2018年の3月にGS YUASAのバッテリーをGETした。

その当時のブログがこれになる。その当時、台湾YUASAのバッテリーが3年しかもたなかったと書いている。これは表現が正しくなかったようだ。台湾YUASAでも3年もつって書くべきなんだと思う。GS YUASAは台湾YUASAとは違って長寿命と思っていたが、3年もたなかった(2年はもった)。

GS YUASAが13000円に対して、台湾YUASAはその半額位。でもって、寿命が同じなら、そりゃ台湾YUASAでしょ。ということで、先ほど台湾YUASAをオーダーしたのだ。

で、届きました。

Img00028_hdr

台湾YUASAからの輸入品だから箱の記載はみんな中国語。

ばててしまったGS YUASAと新品台湾YUASAの新旧交代。

Img00029_hdr

当然のことだけれど新品バッテリーは超快適・強力にセルをぶん回してくれる。バッテリーは徐々に弱くなっていくので、どの程度弱くなったのか認識しずらいけれど、旧・新を比較すると一目瞭然。これであと2年位はバッテリーにドキドキしなくてよくなった。

2021年3月 6日 (土)

デジタルフィルターの実験

Python scipyでデジタルフィルターの実験をしてみた。

インプットとしてフォトレジスターの値をMCP3208で読み取った。Raspberry Pi 4BにSPIでインターフェースしている。回路図左側のラベルはRaspberry Pi 4BのGPIO信号で、カッコ内はヘッダーピン番号。

Mcs3208cds

実際の様子はこんな感じ。
Img04797

0.01秒周期で512サンプル行った。読み取ったサンプルデータに対して先人の知恵に学びながButterフィルターをかけてみた。

写真のセットを机の上(蛍光灯、LED証明、LCDモニター前)に置いた場合。
通過域端周波数 4Hz、阻止域端周波数 6Hz

どうやら蛍光灯の影響で3Hzから4Hzの間の周波数でCdS出力が変化する(蛍光灯を切るとこの周期の波はなくなった)。通過域端周波数を4Hzとするとフィルター出力は正にこの変化を捉えることになった。

Fl2fp4ps6

通過域端周波数 1Hz, 阻止域端周波数 3Hz

通過域端周波数を1Hzとすると、3~4Hzの波の下に隠れている周波数成分を取り出すことが出来たようだ。

Fl6fp1fs3

ちなみに蛍光灯を消した状態ではこんな感じになった。

Fl7

CdSを手で覆って光を遮断した状態
通過域端周波数 4Hz、阻止域端周波数 6Hz

CdSの光を遮断(センサー表面を手で隠す)した場合、相対的にノイズ成分が多くなる。この状態でフィルターしてみた。確かにノイズの下に隠れている波を取り出しているように見える。

Fl5fp4fs6dark

CdSの上およそ20cmのところで手のひらを1秒弱で往復させた場合
通過域端周波数 2Hz、阻止域端周波数 4Hz

1~2Hz程度でインプットがあった場合の周期性を捉える実験もしてみた。これは手のひらを通過させたときの出力変位が多きの出フィルターするまでもない感じだけれども、仮に多量にノイズが乗っていても恐らく同様の結果が得られるものと期待できる。

Fl4fp2fs4

記録のためにここで使ったコードは以下に置く。多くの方々の知恵をまとめて一つにしたもの。

ダウンロード - filtertest2.py

感謝。

 

 

 

 

2021年3月 5日 (金)

ADCのサンプリングレート

アナログ出力に対してADCをかけて波形サンプリングをしたい。サンプリングレートはどの程度になるのか以下の2パターンを実験してみた。

  • PicoのADCを使ってサンプリングして、PicoからUARTでRaspberry Piにデータを取り込む
  • ADC IC MCP3208を使ってSPIでRaspberry Piにデータを取り込む

結果

PicoのADCをUARTでサンプリングした場合の最小周期は1300us(800Hz)程度
MCP3208をSPIでサンプリングした場合の最小周期は50us(20KHz)程度

結論

ナイキスト周波数を100Hzとすればいずれの方法でもサンプリングは可能。

 

PicoのADCをUARTにて

PicoのUART0(1ピン、2ピン)をPiのUART(8ピン、10ピン)に接続した。

以下のMicroPythonをPicoで実行。

import machine
import utime

uart = machine.UART(1,115200)
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / 65535

count = 0
ptime = utime.ticks_ms()
while True:
reading = sensor_temp.read_u16() * conversion_factor

temperature = 27 - (reading - 0.706) / 0.001721
ctime = utime.ticks_us()
count += 1
output = "{}/{}\n".format(count, (ctime - ptime))
if (count % 1000) == 0:
   print(output)
uart.write(output)
ptime = ctime

 

以下のPythonコードをRaspberry Pi 4Bにて実行した。

import time
import serial


s = serial.Serial("/dev/serial0",115200, timeout=3)
s.reset_input_buffer()
count = 0

try:
   while True:

      line =s.readline()
      line = line.decode('utf-8')
      count += 1
      if (count % 1000) == 0:
         print("{}".format(line))


except KeyboardInterrupt:
   pass

結果は以下。1000回に1回、カウント数とループ一回当たりの時間をコンソール出力している。

Adc0

 

MCP3208をSPIにて

MCP3208をRaspberry Pi 4BのSPIに接続している。PythonコードはBlue Backs Raspberry Piで学ぶ電子回路に掲載されているものを使っている。


import RPi.GPIO as GPIO
import time

# MCP3208からSPI通信で12ビットのデジタル値を取得。0から7の8チャンネル使用可
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
   if adcnum > 7 or adcnum < 0:
      return -1
   GPIO.output(cspin, GPIO.HIGH)
   GPIO.output(clockpin, GPIO.LOW)
   GPIO.output(cspin, GPIO.LOW)

   commandout = adcnum
   commandout |= 0x18 # スタートビット+シングルエンドビット
   commandout <<= 3 # LSBから8ビット目を送信するようにする   

   for i in range(5):
# LSBから数えて8ビット目から4ビット目までを送信
      if commandout & 0x80:
         GPIO.output(mosipin, GPIO.HIGH)
      else:
         GPIO.output(mosipin, GPIO.LOW)
      commandout <<= 1
      GPIO.output(clockpin, GPIO.HIGH)
      GPIO.output(clockpin, GPIO.LOW)
   adcout = 0
# 13ビット読む(ヌルビット+12ビットデータ)
   for i in range(13):
      GPIO.output(clockpin, GPIO.HIGH)
      GPIO.output(clockpin, GPIO.LOW)
      adcout <<= 1
      if i>0 and GPIO.input(misopin)==GPIO.HIGH:
         adcout |= 0x1
   GPIO.output(cspin, GPIO.HIGH)
   return adcout

GPIO.setmode(GPIO.BCM)
# ピンの名前を変数として定義
SPICLK = 11
SPIMOSI = 10
SPIMISO = 9
SPICS = 8
# SPI通信用の入出力を定義
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICS, GPIO.OUT)

ptime = time.time()
count = 0
try:
   while True:
      inputVal0 = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS)
      ctime=time.time()
      if (count % 1000) == 0:
         print("{}/{}".format(inputVal0, ctime-ptime))
      ptime=ctime
      count += 1

except KeyboardInterrupt:
   pass

GPIO.cleanup()

結果は以下の通り。1000回に1回、ADC値とループ時間をコンソール出力している。5掛ける10のマイナス5乗で50us。

Adc1

以上。

2021年3月 4日 (木)

Raspberry Pi 4でscipyをimport

以下の3つのimportを持つPythonコードについての作業記録。環境はRaspberry Pi 4B, Python 3.7, Python3 IDLE。

import numpy
import scipy
import matplotlib.pyplot

コードをRUNすると以下のエラーになった。

Traceback (most recent call last):
File "/home/pi/raspi/study/filter-test.py", line 3, in <module>
from scipy import signal
ModuleNotFoundError: No module named 'scipy'


pi@raspberrypi:~ $ sudo apt-get install python-scipy
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libexiv2-14 libgfortran3 libgmime-2.6-0 uuid-dev
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
python-decorator
提案パッケージ:
python-scipy-doc
以下のパッケージが新たにインストールされます:
python-decorator python-scipy
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 1 個。
8,955 kB のアーカイブを取得する必要があります。
この操作後に追加で 38.2 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf python-decorator all 4.3.0-1.1 [14.4 kB]
取得:2 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf python-scipy armhf 1.1.0-7 [8,941 kB]
8,955 kB を 8秒 で取得しました (1,144 kB/s)
以前に未選択のパッケージ python-decorator を選択しています。
(データベースを読み込んでいます ... 現在 179465 個のファイルとディレクトリがインストールされています。)
.../python-decorator_4.3.0-1.1_all.deb を展開する準備をしています ...
python-decorator (4.3.0-1.1) を展開しています...
以前に未選択のパッケージ python-scipy を選択しています。
.../python-scipy_1.1.0-7_armhf.deb を展開する準備をしています ...
python-scipy (1.1.0-7) を展開しています...
python-decorator (4.3.0-1.1) を設定しています ...
python-scipy (1.1.0-7) を設定しています ...

なんだかインストールできた感じがする。再びRUNするも、結果は同じ。Scipy Moduleが無いといってくる。そこでpipでのインストールを実行した。

pi@raspberrypi:~ $ sudo pip install scipy
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting scipy
Downloading https://www.piwheels.org/simple/scipy/scipy-1.6.1-cp37-cp37m-linux_armv7l.whl (62.0MB)
100% |████████████████████████████████| 62.0MB 7.3kB/s
Collecting numpy>=1.16.5 (from scipy)
  Downloading https://www.piwheels.org/simple/numpy/numpy-1.20.1-cp37-cp37m-linux_armv7l.whl (11.6MB)
    100% |████████████████████████████████| 11.6MB 39kB/s
Installing collected packages: numpy, scipy
  Found existing installation: numpy 1.16.2
    Not uninstalling numpy at /usr/lib/python3/dist-packages, outside environment /usr
    Can't uninstall 'numpy'. No files were found to uninstall.
Successfully installed numpy-1.20.1 scipy-1.6.1

なんだか既にインストールされているnumpyとして1.16.2があるけれどアンインストールできなかったと言ってる。でも1.20.1は無事インストールできたようだ。結果を見る限りなんだかよい感じだ。そこで再びRUNを実行してみた。結果はエラー。。。。

Traceback (most recent call last):
File "/usr/local/lib/python3.7/dist-packages/numpy/core/__init__.py", line 22, in <module>
from . import multiarray
File "/usr/local/lib/python3.7/dist-packages/numpy/core/multiarray.py", line 12, in <module>
from . import overrides
File "/usr/local/lib/python3.7/dist-packages/numpy/core/overrides.py", line 7, in <module>
from numpy.core._multiarray_umath import (
ImportError: libf77blas.so.3: cannot open shared object file: No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/pi/raspi/study/filter-test.py", line 2, in <module>
import numpy as np
File "/usr/local/lib/python3.7/dist-packages/numpy/__init__.py", line 145, in <module>
from . import core
File "/usr/local/lib/python3.7/dist-packages/numpy/core/__init__.py", line 48, in <module>
raise ImportError(msg)
ImportError:

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.

We have compiled some common reasons and troubleshooting tips at:

https://numpy.org/devdocs/user/troubleshooting-importerror.html

Please note and check the following:

* The Python version is: Python3.7 from "/usr/bin/python3.7"
* The NumPy version is: "1.20.1"

and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.

Original error was: libf77blas.so.3: cannot open shared object file: No such file or directory

>>>

どうもlibf77blas.so.3が無いって言っている。先人の知恵に学ぶとlibatlas-base-devをインストールすれば解決するらしい。

pi@raspberrypi:~ $ sudo apt install libatlas-base-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libexiv2-14 libgfortran3 libgmime-2.6-0 uuid-dev
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
libatlas3-base
提案パッケージ:
libatlas-doc liblapack-doc
以下のパッケージが新たにインストールされます:
libatlas-base-dev libatlas3-base
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 1 個。
5,365 kB のアーカイブを取得する必要があります。
この操作後に追加で 32.1 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian buster/main armhf libatlas3-base armhf 3.10.3-8+rpi1 [2,399 kB]
取得:2 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libatlas-base-dev armhf 3.10.3-8+rpi1 [2,966 kB]
5,365 kB を 2秒 で取得しました (2,200 kB/s)
以前に未選択のパッケージ libatlas3-base:armhf を選択しています。
(データベースを読み込んでいます ... 現在 180480 個のファイルとディレクトリがインストールされています。)
.../libatlas3-base_3.10.3-8+rpi1_armhf.deb を展開する準備をしています ...
libatlas3-base:armhf (3.10.3-8+rpi1) を展開しています...
以前に未選択のパッケージ libatlas-base-dev:armhf を選択しています。
.../libatlas-base-dev_3.10.3-8+rpi1_armhf.deb を展開する準備をしています ...
libatlas-base-dev:armhf (3.10.3-8+rpi1) を展開しています...
libatlas3-base:armhf (3.10.3-8+rpi1) を設定しています ...
update-alternatives: /usr/lib/arm-linux-gnueabihf/libblas.so.3 (libblas.so.3-arm-linux-gnueabihf) を提供するために自動モードで /usr/lib/arm-linux-gnueabihf/atlas/libblas.so.3 を使います
update-alternatives: /usr/lib/arm-linux-gnueabihf/liblapack.so.3 (liblapack.so.3-arm-linux-gnueabihf) を提供するために自動モードで /usr/lib/arm-linux-gnueabihf/atlas/liblapack.so.3 を使います
libatlas-base-dev:armhf (3.10.3-8+rpi1) を設定しています ...
update-alternatives: /usr/lib/arm-linux-gnueabihf/libblas.so (libblas.so-arm-linux-gnueabihf) を提供するために自動モードで /usr/lib/arm-linux-gnueabihf/atlas/libblas.so を使います
update-alternatives: /usr/lib/arm-linux-gnueabihf/liblapack.so (liblapack.so-arm-linux-gnueabihf) を提供するために自動モードで /usr/lib/arm-linux-gnueabihf/atlas/liblapack.so を使います
libc-bin (2.28-10+rpi1) のトリガを処理しています ...
pi@raspberrypi:~ $

インストールが無事完了。再度RUNを実行したところimportは無事成功し期待するようにコードが実行された。

めでたし、めでたし。

ところで、apt-getとpipは何が違うのか。aptはシステム環境、pipは個別環境にインストールされるということでインストール先が違うらしい。またインストール元(リポジトリ)が異なる。すくなくともIDLEのRUN環境ではpipのインストール先を見に行っているんだろうとは思う。結果を左右したのはそのくらいなのだろうか。。。。

 

«TKinter afterメソッド:再帰的コールによる自動更新